我有一個存盤程序,其中我傳入了三個郵政編碼(或郵政編碼的T-SQL重碼)
@postCode nvarchar(50) null,
@postCode2 nvarchar(50) null,
@postCode3 nvarchar(50) null,
在我的where子句中,我需要搜索任何一個輸入的職位代碼,但如果傳來一個空值,就忽略這個引數。
如果我像下面那樣使用AND,就不會有行被回傳,因為它在尋找一個匹配兩個不同郵編的記錄
WHERE((@postCode IS NULL OR CompPostCode. CompPostCode LIKE @postCode)
AND (@postCode2 IS NULL OR CompPostCode。 CompPostCode LIKE @postCode2)
AND (@postCode3 IS NULL OR CompPostCode。 CompPostCode LIKE @postCode3))
如果我使用OR,那么只要有一個引數是空的,它就會回傳表中的任何郵政編碼
。WHERE((@postCode IS NULL OR CompPostCode. CompPostCode LIKE @postCode)
OR (@postCode2 IS NULL OR CompPostCode。 CompPostCode LIKE @postCode2)
OR (@postCode3 IS NULL OR CompPostCode。 CompPostCode LIKE @postCode3))
我必須考慮到三個引數都是空的情況
當一個引數為空時,我如何忽略這個條件,但當提供一個值時,仍然使用一個OR條件?uj5u.com熱心網友回復:
你根本不需要IS NULL條款:
WHERE (CompPostCode.CompPostCode LIKE @postCode)
OR CompPostCode.CompPostCodeLIKE @postCode2
OR CompPostCode.CompPostCode LIKE @postCode3)
不過,事實上,你最好還是用一個表型別引數。然后你可以為郵政編碼傳遞0 的值(盡管傳遞0行會導致沒有結果),并且可以做一個簡單的EXISTS:
WHERE EXISTS (SELECT 1)
FROM @YourTableParameter YTP
WHERE CPC.CompPostCode LIKE YTP.PostCode)
移動門柱的答案:
為了滿足所有的引數值都是NULL,你需要添加一個額外的OR:
WHERE (CompPostCode.CompPostCode LIKE @postCode )
OR CompPostCode.CompPostCodeLIKE @postCode2
OR CompPostCode.CompPostCodeLIKE @postCode3
OR (@postCode IS NULL AND @postCode2 IS NULL AND @postCode3 IS NULL) )
對于表型別引數,你需要添加一個NOT EXISTS子句:
WHERE (EXISTS (SELECT 1)
FROM @YourTableParameter YTP
WHERE CPC.CompPostCode LIKE YTP.PostCode)
OR NOT EXISTS (SELECT 1 FROM @YourTableParameter YTP)
現在這兩個都是 "全能"/"廚房水槽 "查詢,我也強烈建議你在查詢的OPTION子句中添加RECOMPILE,如果你還沒有的話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328413.html
標籤:
