Я пытаюсь создать новую таблицу, но изменяю некоторые данные из старой таблицы с помощью оператора 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
Я получаю синтаксические ошибки. Неправильный синтаксис рядом с ключевым словом «от». и еще несколько, по продолжительности
Ну да, вам придется удалить остальную часть подзапроса... Я дал вам только начальную подсказку...
Вам не хватает основ SQL, вы хотите применить функцию, которую вы выполняете, к той же строке, которую вы выбираете... поэтому вам не нужно выбирать другую строку для применения функции.
После удаления всех подзапросов я получаю сообщение «Ошибка преобразования при преобразовании значения 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 ОСТАЛЬНОЙ продолжительности
Мы не можем ответить на этот вопрос, не видя кода функции... но, вероятно, он не очень надежен.
В будущем, пожалуйста, не забывайте предоставлять минимально воспроизводимый пример с образцами данных и желаемыми результатами, поскольку это позволило бы нам гораздо быстрее предоставить полезное решение.


Что-то вроде этого:
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'.
Вам не нужно выбирать из своего UDF, просто используйте его без выбора, например.
WHEN s.duration LIKE '%day%' THEN dbo.getNumericValue(duration) * 14400 ...