2010-07-27 3 views
31

У меня есть огромный запрос, который использует case/when часто. Теперь у меня есть этот SQL, который не работает.Как использовать T-SQL Case/When?

(select case when xyz.something = 1 
then 
    'SOMETEXT' 
else 
     (select case when xyz.somethingelse = 1) 
     then 
      'SOMEOTHERTEXT' 
     end) 

     (select case when xyz.somethingelseagain = 2) 
     then 
      'SOMEOTHERTEXTGOESHERE' 
     end) 
end) [ColumnName], 

Что вызывает проблемы является xyz.somethingelseagain = 2, он говорит, что не может связать это выражение. xyz - это некоторый псевдоним для таблицы, которая добавляется далее в запрос. Что здесь не так? Удаление одного из двух случаев/когда исправляет это, но мне нужны оба из них, возможно, еще больше случаев.

ответ

74
SELECT 
    CASE 
    WHEN xyz.something = 1 THEN 'SOMETEXT' 
    WHEN xyz.somethingelse = 1 THEN 'SOMEOTHERTEXT' 
    WHEN xyz.somethingelseagain = 2 THEN 'SOMEOTHERTEXTGOESHERE' 
    ELSE 'SOMETHING UNKNOWN' 
    END AS ColumnName; 
+0

Работы, Что разница? :) – grady

+2

Допустим, у меня есть некоторые из таких символов, как: WHEN xyz.something = 1 и xyz.abc = 2 THEN 'SOMETEXT' WHEN xyz.something = 1 и xyz.abc <> 2 THEN 'SOMEOTHERTEXT' Могу ли я сказать, что если первое, когда было установлено, что предстоящие пропускаются? Что-то, что ускользает от случая/когда? – grady

4

Как только инструкция WHEN истинна, разрыв является неявным.

Вам нужно будет понять, КОТОРЫЙ ВЫРАЖЕНИЕ ВЫПОЛНЕНИЕ наиболее вероятно. Если вы укажете, что WHEN в конце длинного списка инструкций WHEN, ваш sql, скорее всего, будет медленнее. Поэтому поставим его первым.

Более подробная информация здесь: break in case statement in T-SQL

+0

Это правда много, но не гарантируется: http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression – RobD

0
declare @n int = 7, 
    @m int = 3; 

select 
    case 
     when @n = 1 then 
      'SOMETEXT' 
    else 
     case 
      when @m = 1 then 
       'SOMEOTHERTEXT' 
      when @m = 2 then 
       'SOMEOTHERTEXTGOESHERE' 
     end 
    end as col1 
-- n=1 => returns SOMETEXT regardless of @m 
-- n=2 and m=1 => returns SOMEOTHERTEXT 
-- n=2 and m=2 => returns SOMEOTHERTEXTGOESHERE 
-- n=2 and m>2 => returns null (no else defined for inner case) 
Смежные вопросы