SQL Server CASE .. WHEN .. IN инструкция

На сервере 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.

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


person Faisal    schedule 18.05.2011    source источник


Ответы (4)


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

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

person Martin Smith    schedule 18.05.2011
comment
Спасибо, я исправил это, как показано ниже - person Faisal; 18.05.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
person Faisal    schedule 18.05.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', ...)

person Vinay Kumar    schedule 18.05.2011
comment
У меня есть fixit как CASE WHEN DeviceID IN ('7', '10', '62', '58', '60', '46', '48', '50', '137', '139', ' 141 ',' 145 ',' 164 ') ТОГДА' 01 'КОГДА DeviceID IN (' 8 ',' 9 ',' 63 ',' 59 ',' 61 ',' 47 ',' 49 ',' 51 ' , '138', '140', '142', '146', '165') THEN '02' ELSE 'NA' END AS тактирование, - person Faisal; 18.05.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 выражение.

person onedaywhen    schedule 18.05.2011