2016-10-10 34 views
0

如何將其正確寫入:WHERE情況,即隨着THEN語句存在

declare @p7_ int 
set @p7_=1 
select * from cdn.tranag 
    where 
    case when @p7_=1 then 
    exists(select * from cdn.zrodla join cdn.dziennik on dzk_gidnumer=zro_dtnumer where TrN_GIDTyp=zro_trntyp and TrN_GIDNumer=zro_trnnumer) 
    else -1 end 

感謝。

+3

添加一些示例表數據和預期結果。 (以及格式化文本。)並標記您正在使用的dbms。 – jarlh

+1

你想達到什麼目的? –

+0

如果參數= 1,則存在。如果參數= 0,則顯示全部 – AdiT

回答

0

SQL中的where條款需要進行比較的東西到別的東西。看起來你只是想說「帶回所有東西,除非@p7_的值爲1,在這種情況下檢查記錄是否存在其他地方。」

可以實現如在where條款andor這種使用簡單的邏輯運算符:

select columns 
from table 
where @p7_ <> 1 
    or (@p7_ = 1 
     and exists(<exists statement>) 
    ) 
0

這可以通過AND/OR邏輯來實現。

您正在尋找此

SELECT * 
FROM cdn.Tranag 
WHERE (@p7_ = 1 
     AND EXISTS(SELECT * 
        FROM cdn.zrodla 
          JOIN cdn.dziennik 
          ON dzk_gidnumer = zro_dtnumer 
        WHERE TrN_GIDTyp = zro_trntyp 
          AND TrN_GIDNumer = zro_trnnumer)) 
     OR @p7_ = 0 
0

我想這是你想要什麼:

select * 
from cdn.tranag t 
where (@p7_= 1 and 
     exists (select 1 
       from cdn.zrodla join 
        cdn.dziennik 
        on dzk_gidnumer = zro_dtnumer 
       where t.TrN_GIDTyp = zro_trntyp and 
        t.TrN_GIDNumer = zro_trnnumer 
      ) 
    ) or 
     (@p7_ <> 1); 

這實現,如果@p7_ = 1那麼exists條款被選中的邏輯。否則,所有行都被選中。注意:這不檢查NULL,但很容易添加。

此外,請注意使用表的別名。你應該總是使用表別名,特別是當你使用子查詢時,特別是當你有多個表時。

0

的側信息的位:

在T-SQL,EXISTS是一個布爾表達式以true/false結果。但是,與許多其他語言不同,true/false T-SQL中的「值」不映射爲整數值。換句話說,您決不能將T-Sql 布爾表達式結果視爲INT值。它們只能用於bool子句,如WHERE ...,JOIN ON ...,IF ...CASE WHEN ...