Подзапрос INSERT INTO SELECT, который использует udf и возвращает 1 значение

Я пытаюсь создать новую таблицу, но изменяю некоторые данные из старой таблицы с помощью оператора INSERT INTO SELECT. Я пытаюсь взять поле с цифрами и буквами, извлечь цифры и умножить эти числа в зависимости от того, представляет ли это число дни, часы или минуты, и вставить результат в мою новую таблицу.

Я нашел пользовательскую функцию для получения числа, www.geeksforgeeks.org/sql-query-to-get-only-numbers-from-a-string/. Хотя функция работает в инструкции SELECT, когда я использую ее как выражение в подзапросе, она терпит неудачу, поскольку возвращает более 1 значения. Как я могу переписать подзапрос, чтобы он возвращал только 1 значение? Или есть лучший способ добиться того, чего я хочу?

Столбец, в котором я использую эту функцию, называется «длительность». Столбец определяется как VARCHAR с такими данными, как «Концентрация до 1 часа» и «24 часа». Я пробовал использовать EXEC вместо SELECT, но получаю несколько синтаксических ошибок.

    CASE
        WHEN s.duration IN ('Instantaneous')
            THEN '0'
  
        WHEN s.duration LIKE '%round%'
            THEN '1'
  
        WHEN s.duration LIKE '%minute%'
            THEN (SELECT dbo.getNumericValue(duration) * 10 
                  FROM Spell.Spells 
                  WHERE duration LIKE '%minute%')                                                                                                                                  
        
        WHEN s.duration LIKE '%hour%'
            THEN  (SELECT dbo.getNumericValue(duration) * 600 
                   FROM Spell.Spells  
                   WHERE duration LIKE '%hour%')

        WHEN s.duration LIKE '%day%'
            THEN (SELECT dbo.getNumericValue(duration) * 14400 
                  FROM Spell.Spells 
                  WHERE duration LIKE '%day%')

        ELSE s.duration
    END AS duration,
    ritual,
    verbal,
    somatic,
    material,
    material_component,
    material_cost,
    material_consumed,
    description,
    source
FROM 
    Spell.Spells AS s

Вам не нужно выбирать из своего UDF, просто используйте его без выбора, например. WHEN s.duration LIKE '%day%' THEN dbo.getNumericValue(duration) * 14400 ...

Dale K 24.06.2024 00:25

Я получаю синтаксические ошибки. Неправильный синтаксис рядом с ключевым словом «от». и еще несколько, по продолжительности

new067 24.06.2024 00:36

Ну да, вам придется удалить остальную часть подзапроса... Я дал вам только начальную подсказку...

Dale K 24.06.2024 00:36

Вам не хватает основ SQL, вы хотите применить функцию, которую вы выполняете, к той же строке, которую вы выбираете... поэтому вам не нужно выбирать другую строку для применения функции.

Dale K 24.06.2024 00:40

После удаления всех подзапросов я получаю сообщение «Ошибка преобразования при преобразовании значения varchar «Пока не рассеяно» в тип данных int». Я не уверен, почему функция передает эти данные, поскольку условие WHEN должно исключать эти поля. СЛУЧАЙ, КОГДА длительность LIKE '%mine%' THEN dbo.getNumericValue(duration) * 10 WHEN длительность LIKE '%hour%' THEN dbo.getNumericValue(duration) * 600 WHEN длительность LIKE '%day%' THEN dbo.getNumericValue(duration) * 14400 ОСТАЛЬНОЙ продолжительности

new067 24.06.2024 00:55

Мы не можем ответить на этот вопрос, не видя кода функции... но, вероятно, он не очень надежен.

Dale K 24.06.2024 01:03

В будущем, пожалуйста, не забывайте предоставлять минимально воспроизводимый пример с образцами данных и желаемыми результатами, поскольку это позволило бы нам гораздо быстрее предоставить полезное решение.

Dale K 24.06.2024 04:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого:

CASE
    WHEN s.duration IN ('Instantaneous')
        THEN 0

    WHEN s.duration LIKE '%round%'
        THEN 1

    WHEN s.duration LIKE '%minute%'
        THEN dbo.getNumericValue(duration) * 10                                                                                                            
        
    WHEN s.duration LIKE '%hour%'
        THEN  dbo.getNumericValue(duration) * 600 

    WHEN s.duration LIKE '%day%'
        THEN dbo.getNumericValue(duration) * 14400 

    ELSE cast(s.duration as int)
END AS duration,
        ritual,
        verbal,
        somatic,
        material,
        material_component,
        material_cost,
        material_consumed,
        description,
        source
    FROM Spell.Spells AS s

Есть некоторые поля, которые имеют значения «пока не рассеются» и «пока не рассеются или не сработают». По сути, они имеют бесконечную продолжительность. Это сработало, когда я превратил их в int, ELSE '999999'.

new067 24.06.2024 01:16

Другие вопросы по теме