2013-07-02 242 views
2

以下SELECT中的註釋掉部分有什麼問題?
如果我取消整個CASE ... END的註釋,則SELECT變爲無效。
我想要的是,取決於是否有送貨地址,取一組地址字段或另一個地址字段,理想情況下無需重複條件或對每個字段使用COALESCE。我正在使用SQL Server 2008 R2。
謝謝!在SELECT中,根據字段值取一組字段或另一個字段

SELECT a, b, c, 
    --  CASE x is null 
    --   THEN d, e, f, 
    --   ELSE g, h, i, 
    --  END 
     k, l, m 
    FROM sometable 

回答

2

考慮把條件X在where子句,然後工會

select a,b,c,d,e,f from table where x is null 
union 
select a,b,c,g,h,i from table where x is not null 

的情況下的東西需要一個WHEN。我總是使用這種結構

CASE ... 
WHEN ... 
THEN ... 
ELSE ... 
END AS Fieldname 

所有5必須存在。它可以用來定義一個輸入域。在它裏面,你當然可以coallesce的,但它不會給回場

數組

編輯:ELSE其實沒有必要,閱讀知情的評論如下

+0

'CASE'表達式(他們不是 「東西」)做不需要「ELSE」部分。 –

+0

爲了提高效率,最好使用'UNION ALL'。準確地說。 'UNION'將消除任何重複。 –

+0

好的,不知道ELSE部分是可選的,謝謝。這裏是我的知識鑽取:表達式表達式表達式表達式 –

2

該查詢會給你正確的答案,這是還容易修改

select 
    s.a, s.b, s.c, 
    a.f1, a.f2, a.f3, 
    s.k, s.l, s.m 
from sometable as s 
    outer apply (
     select s.d as f1, s.e as f2, s.f as f3 where s.x is null 
     union all 
     select s.g as f1, s.h as f2, s.i as f3 where s.x is not null 
    ) as a 

SQL FIDDLE EXAMPLE

2

你缺少WHEN,而你只允許從CASE表達式返回一個值

SELECT a, b, c, 
     CASE WHEN x is null 
      THEN d 
      ELSE g 
     END, 
     CASE WHEN x is null 
      THEN e 
      ELSE h 
     END, 
     CASE WHEN x is null 
      THEN f 
      ELSE i 
     END, 
    k, l, m 
FROM sometable 

這還假定類型的dg是兼容的,因爲是(eh)和(fi

+0

我不知道爲什麼這得到了downvote。這是一個非常有效的答案。 –

+0

@ypercube - 可能有人很惱火,我沒有達到「理想情況下沒有重複...」 –

+0

我也猜到了。但是你的答案也是唯一一個清楚解釋OP的查詢不起作用的原因。 –

相關問題