SQL Server CASE .. WHEN .. IN - PullRequest
       10

SQL Server CASE .. WHEN .. IN

28 голосов
/ 18 мая 2011

На сервере SQL 2005 я пытаюсь запросить этот оператор выбора

SELECT AlarmEventTransactionTableTable.TxnID,
       CASE AlarmEventTransactions.DeviceID
         WHEN DeviceID IN( '7', '10', '62', '58',
                           '60', '46', '48', '50',
                           '137', '139', '142', '143', '164' )
           THEN '01'
         WHEN DeviceID IN( '8', '9', '63', '59',
                           '61', '47', '49', '51',
                           '138', '140', '141', '144', '165' )
           THEN '02'
         ELSE 'NA'
       END AS clocking,
       AlarmEventTransactionTable.DateTimeOfTxn
FROM   multiMAXTxn.dbo.AlarmEventTransactionTable 

Возвращает ошибку ниже

Сообщение 156, Уровень 15, Состояние 1, Строка 4 Неверный синтаксис рядом с ключевое слово "IN".

Пожалуйста, дайте мне несколько советов о том, что может быть не так с моим кодом.

Ответы [ 4 ]

37 голосов
/ 18 мая 2011

CASE AlarmEventTransactions.DeviceID должно быть просто CASE.

Вы смешиваете 2 формы выражения CASE .

10 голосов
/ 18 мая 2011

Спасибо за ответ Я изменил утверждения, чтобы они выглядели так, как показано ниже

SELECT
     AlarmEventTransactionTable.TxnID,
     CASE 
    WHEN DeviceID IN('7', '10', '62', '58', '60',
            '46', '48', '50', '137', '139',
             '141', '145', '164') THEN '01'
    WHEN DeviceID IN('8', '9', '63', '59', '61',
            '47', '49', '51', '138', '140',
            '142', '146', '165') THEN '02'
             ELSE 'NA' END AS clocking,
     AlarmEventTransactionTable.DateTimeOfTxn
FROM
     multiMAXTxn.dbo.AlarmEventTransactionTable
5 голосов
/ 18 мая 2011

Попробуйте это ...

SELECT
    AlarmEventTransactionTableTable.TxnID,
    CASE
        WHEN DeviceID IN('7', '10', '62', '58', '60',
                 '46', '48', '50', '137', '139',
                 '142', '143', '164') THEN '01'
        WHEN DeviceID IN('8', '9', '63', '59', '61',
                 '47', '49', '51', '138', '140',
                 '141', '144', '165') THEN '02'
        ELSE 'NA' END AS clocking,
    AlarmEventTransactionTable.DateTimeOfTxn
 FROM
    multiMAXTxn.dbo.AlarmEventTransactionTable

Просто удалите выделенную строку

ВЫБЕРИТЕ AlarmEventTransactionTableTable.TxnID, CASE AlarmEventTransactions.DeviceID КОГДА DeviceID IN ('7',«10», «62», «58», «60», ...)

2 голосов
/ 18 мая 2011

Может быть легче читать, если записывать от руки, используя «простой регистр», например

CASE DeviceID 
   WHEN '7  ' THEN '01'
   WHEN '10 ' THEN '01'
   WHEN '62 ' THEN '01'
   WHEN '58 ' THEN '01'
   WHEN '60 ' THEN '01'
   WHEN '46 ' THEN '01'
   WHEN '48 ' THEN '01'
   WHEN '50 ' THEN '01'
   WHEN '137' THEN '01'
   WHEN '139' THEN '01'
   WHEN '142' THEN '01'
   WHEN '143' THEN '01'
   WHEN '164' THEN '01'
   WHEN '8  ' THEN '02'
   WHEN '9  ' THEN '02'
   WHEN '63 ' THEN '02'
   WHEN '59 ' THEN '02'
   WHEN '61 ' THEN '02'
   WHEN '47 ' THEN '02'
   WHEN '49 ' THEN '02'
   WHEN '51 ' THEN '02'
   WHEN '138' THEN '02'
   WHEN '140' THEN '02'
   WHEN '141' THEN '02'
   WHEN '144' THEN '02'
   WHEN '165' THEN '02'
   ELSE 'NA' 
END AS clocking

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

...