Использование части значения поля в TSQL - PullRequest
1 голос
/ 14 января 2011

Можно ли использовать только несколько начальных символов значения поля в качестве основы для оператора case в хранимой процедуре SQL Server?
Например, мне нужно обновить поле в таблице в соответствии с первыми тремя символами в другом поле той же таблицы:

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

Как можно использовать первые три символа значения Field2 вместо ????

Ответы [ 5 ]

5 голосов
/ 14 января 2011

Использование SUBSTRING

UPDATE Table1
SET Column1 = CASE SUBSTRING(Column2,1,3)
             WHEN 'vl1' THEN '01'
             WHEN 'vl2' THEN '02'
             WHEN 'vl3' THEN '03' 
             '''''
END

(я переключился на простое выражение CASE , поскольку это все, что нам нужно здесь, и также изменил терминологию)

3 голосов
/ 14 января 2011
UPDATE Table1 
SET Column1 = CASE left(Column2,3) 
      WHEN 'vl1' THEN '01'              
      WHEN 'vl2' THEN '02'              
      WHEN 'vl3' THEN '03'               
      ''''' 
END 
1 голос
/ 14 января 2011

Если вам нужно беспокоиться только об одной цифре, вы можете использовать

UPDATE Table1
SET Column1 = '0' + SUBSTRING(Column2,3,1)
0 голосов
/ 14 января 2011

Мне нравится идея отображения 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;
0 голосов
/ 14 января 2011

ОБНОВЛЕНО - ой, спасибо за подсказку Дэмиен!

Вы также можете настроить таблицу сопоставления для выполнения слияния вместо строки за строкой. (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...