是否可以在SQL Server存储过程中仅使用字段值的几个起始字符作为case语句的基础?
例如,我需要根据同一个表的另一个字段中的前三个字符更新表中的字段:
UPDATE Table1
SET Field1 = CASE
WHEN ??? = 'vl1' THEN '01'
WHEN ??? = 'vl2' THEN '02'
WHEN ??? = 'vl3' THEN '03'
'''''
END
如何使用Field2
值而不是???
的前三个字符?
答案 0 :(得分:5)
UPDATE Table1
SET Column1 = CASE SUBSTRING(Column2,1,3)
WHEN 'vl1' THEN '01'
WHEN 'vl2' THEN '02'
WHEN 'vl3' THEN '03'
'''''
END
(我已切换到simple CASE expression,因为这就是我们所需要的,并且也切换了术语。
答案 1 :(得分:3)
UPDATE Table1
SET Column1 = CASE left(Column2,3)
WHEN 'vl1' THEN '01'
WHEN 'vl2' THEN '02'
WHEN 'vl3' THEN '03'
'''''
END
答案 2 :(得分:1)
如果你只需要担心一个数字就可以使用
UPDATE Table1
SET Column1 = '0' + SUBSTRING(Column2,3,1)
答案 3 :(得分:0)
更新 - 哎哟,感谢提示Damien!
您还可以设置映射表来进行合并,而不是逐行进行合并 (2005 +)
;with map(old,new) as (
select 'vl1', '01' union all
select 'vl2', '02' union all
select 'vl3', '03'
)
UPDATE Table1
SET Field1 = Map.new
From Table1
Left Join Map on Map.old=Left(Table1.Field,3)
答案 4 :(得分:0)
我喜欢映射CTE(@cyberkiwi)的想法,但不是旧式专有代码(new
和old
是保留字)。
这是重写:
WITH Map (old_field2, new_field1)
AS
(
SELECT old_field2, new_field1
FROM (
VALUES ('vl1', '01'),
('vl2', '02'),
('vl3', '03')
) AS Map (old_field2, new_field1)
)
MERGE INTO Table1
USING Map AS source
ON Table1.Field2 LIKE source.old_field2 + '%'
WHEN MATCHED THEN
UPDATE
SET Field1 = source.new_field1;