Странная проблема, сочетающая IF и CASE в запросе T SQL - PullRequest
0 голосов
/ 28 марта 2020

Вот проблема, которая, кажется, должна быть проста, но я некоторое время работал над ней и не могу понять, почему я не могу объединить CASE в одной области запроса и IF в другой.

Кто-нибудь видит, что здесь происходит? У меня есть старый набор данных, который необходимо преобразовать для работы с новыми таблицами. Данные извлекаются из WDDX и помещаются во временную таблицу. Это все работает правильно.

Вот тут у меня проблемы. Мне нужно извлечь значение в новый столбец с именем DetailValue, когда появляется XXXX, и в таких случаях значение, появляющееся после XXXX, представляет собой число, которое принадлежит DetailValue, затем следует _, и в этом случае число, появляющееся после _ принадлежит RiskValue. Кроме того, при появлении ZZZZ в DetailValue появляется следующий символ, который всегда является последним.

Когда это просто CASE, все работает нормально, но когда я добавляю IF, чтобы получить значение, он говорит мне:

"Неверный синтаксис рядом с ключевым словом« IF ». Msg 156 , Уровень 15, Состояние 1, Процедура OldSysDataConv Неверный синтаксис рядом с ключевым словом 'THEN'.

Код:

 SELECT VarName, 
 CASE 
   WHEN (CHARINDEX('XXXX', VarName) > 0 and SUBSTRING(VarName, CHARINDEX('XXXX', VarName), len(VarName)) like '%XXXX%') or SUBSTRING(VarName, CHARINDEX('ZZZZ', VarName), len(VarName)) like '%ZZZZ%' then

    left(replace(left(replace(VarName, 'XXXX', ''), len(VarName)-4), 'ZZZZ', ''), (len(VarName)-5))
else
    null
END as DetailName,
IF CHARINDEX('ZZZZ', VarName) > 0 THEN
    right(VarName, 1)
END
 as DetailValue,

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я решил свою проблему, упростив свой оператор CASE. Некоторые основы c логи c просто ускользнули от меня в течение долгого дня. ;)

Ответ:

 CASE
 WHEN CHARINDEX('XXXX', VarName) > 0 AND CHARINDEX('ZZZZ', VarName) <> 0 THEN
    substring(VarName, (CHARINDEX('_', VarName)-1), len(VarName))
 ELSE
     right(VarName, 1)
 END
 as DetailValue,
0 голосов
/ 28 марта 2020

Нет такой вещи как IF ... THEN ... END выражение в чистом виде SQL. Это процедурный оператор , который используется в хранимой процедуре.

Вы хотите либо IIF(), что является T- SQL Speci c:

IIF(CHARINDEX('ZZZZ', VarName) > 0, right(VarName, 1), null) as DetailValue

или более стандартный CASE:

CASE WHEN CHARINDEX('ZZZZ', VarName) > 0 THEN right(VarName, 1) END as DetailValue
...