2011-12-20 38 views
0

馬上就蝙蝠 - 我很新''時''。我讀了以下內容:How do I perform an IF...THEN in an SQL SELECT?但是它並沒有真正回答我的問題。使用案例 - 這可能嗎?

基本上我想要做的是沿着以下線的東西:

select 
    section_name, * 
from 
    property.lease_period lp 
where 
    lp.lease_current_stop_date < getdate() and (lp.lease_status = 'Active' or lp.lease_status = 'Overholding') 
    and lp.period_id = @period_id 
    and lp.building_id = @building_id 
    and not exists 
    (
     select 1 
     from lease_deal.lease 
     where lp.suite_name = tenancy_reference 
     and lp.building_id = building_id 
    ) 
    case when(@section_name <> 'ALL') 
    then(and upper(section_name) = upper(@section_name)) 
    end 
order by period_id desc 

這可能嗎?如果是這樣我做錯了什麼?

鉈;博士:

基本上我想:

and upper(section_name) = upper(@section_name) 

要只適用於我的where子句時@section_name不等於 'ALL'

+0

千萬不要使用select *。在這裏,您將返回section_name兩次,這是浪費的服務器資源。同樣的事情發生,如果你有一個連接。另外選擇*本身更慢。只使用您實際需要的列。 – HLGEM

+0

但是我同意這個SQL用於SSRS報告 - 我的正常調用點是從選擇所有列開始,然後在我知道報告將使用的所有內容(客戶端往往是要求在整個開發過程中添加額外的數據)。 我確實承認,我應該在這裏使用lp。*這裏 - 宣稱*本身就是不好的做法。 – Codingo

回答

3

你才能將您的(非工作)CASE更改爲

AND (@section_name = 'ALL' OR upper(section_name) = upper(@section_name)) 
+2

如果你的服務器不是CASE敏感的 - 你可以跳過UPPER函數來獲得更多的性能和使用(可能)適當的索引 –

+0

'AND'而不是'OR' –

+0

否 - 實際上是OR仔細閱讀8 - ) –

0
AND upper(section_name)=CASE WHEN @section_name <> 'ALL' THEN upper(@section_name) 
                 ELSE upper(section_name) 
         END 
1

這可以以更簡單的方式完成,無需使用CASE。它會是這樣的:

and ((upper(section_name) = upper(@section_name) and @section_name <> 'ALL') OR @section_name ='ALL') 
+0

優秀!爲了利益,有沒有辦法用一個案例來完成我上面概述的內容? – Codingo