2012-07-03 2 views
0

Может кто угодно декодировать следующий вложенный IIF в оператор CASE в SQL. Я знаю, что в SQL Server 2012 допускается использование IIF, но мне трудно получить легкое понимание вложенной логики IIF .. следующее мое вложенное заявление IIFCASE-эквивалент вложенного заявления IIF

IIF(IIF(TABLE_A.Col_1 = 0, TABLE_A.Col_2 + (2*TABLE_A.Col_3), TABLE_A.Col_1)<=.5, 'A', 'B') AS Result 

Любая помощь очень ценится.

ответ

3

Это должно быть эквивалентно:

CASE 
    WHEN 
     CASE 
      WHEN TABLE_A.Col_1 = 0 
      THEN TABLE_A.Col_2 + (2*TABLE_A.Col_3) 
      ELSE TABLE_A.Col_1 
     END <= .5 
    THEN 'A' 
    ELSE 'B' 
END As Result 
+0

Awesome .. Спасибо! – rock

1
CASE 
    WHEN 
    (CASE 
      WHEN TABLE_A.Col1= 0 
      THEN TABLE_A.Col2_2 + (2*TABLE_A.Col3) 
      ELSE TABLE_A.Col1 
     END) <=0.5 
    THEN 'A' 
    ELSE 'B' 
END 
AS result 
+0

@Raphael .. очень впечатлен такой быстрый ответ .. Спасибо! – rock

0

Я думаю, что это то, что она сводится к тому, в одном случае выражение:

CASE 
    WHEN TABLE_A.Col_1 = 0 AND TABLE_A.Col_2 + (2*TABLE_A.Col_3) <= .5 THEN 'A' 
    WHEN TABLE_A.Col_1 <> 0 AND TABLE_A.Col_1 <= .5 THEN 'A' 
    ELSE 'B' 
END 
0

Это старая сейчас, и есть другие ответы, которые уже работают, но для удовольствия можно написать это как функциональное выражение без каких-либо операторов CASE вообще, например:

char(65 + ceiling(ceiling(COALESCE(NULLIF(TABLE_A.Col_1, 0), TABLE_A.Col_2 + (2*TABLE_A.Col_3))) - .5/10000000000000)) 

Существует очень небольшой шанс, что функциональный подход будет заметно улучшаться на больших наборах с хорошей индексацией.

Вот мое доказательство правильности концепции сценария тестирования:

http://sqlfiddle.com/#!3/a95b3/2

Смежные вопросы