我正在尝试创建一个新表,但使用 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
类似这样的:
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