在SQL中使用部分字段值

时间:2011-01-14 08:05:15

标签: sql sql-server tsql stored-procedures

是否可以在SQL Server存储过程中仅使用字段值的几个起始字符作为case语句的基础?
例如,我需要根据同一个表的另一个字段中的前三个字符更新表中的字段:

UPDATE Table1
SET Field1 = CASE 
             WHEN ??? = 'vl1' THEN '01'
             WHEN ??? = 'vl2' THEN '02'
             WHEN ??? = 'vl3' THEN '03' 
             '''''
END

如何使用Field2值而不是???的前三个字符?

5 个答案:

答案 0 :(得分:5)

使用SUBSTRING

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)的想法,但不是旧式专有代码(newold是保留字)。

这是重写:

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;