2010-07-27 49 views
31

我有一個巨大的查詢,它使用案件/當經常。現在我在這裏有這個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是在查詢中進一步向下連接的表的別名。這裏有什麼問題?除去2個案例中的一個可以糾正這個問題,但我需要兩個案例,甚至更多案例。

回答

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 2010-07-27 09:50:22

+2

可以說我有一些whens重複,如下所示: WHEN xyz.something = 1 and xyz.abc = 2 THEN'SOMETEXT' WHEN xyz.something = 1 and xyz.abc <> 2 THEN 'SOMEOTHERTEXT' 我可以以某種方式說,如果第一次設置即將到來的跳過?什麼東西可以逃脫案件/何時? – grady 2010-07-27 10:07:04

4

只要WHEN語句爲真,中斷就是隱含的。

您將不得不concise哪個表達式是最有可能發生的。如果你把這個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 2016-08-22 16:26:12

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)