我需要撰寫SQL查詢,該查詢在WHERE子句中有幾個條件陳述句。
偽裝的代碼看起來像這樣:
SELECT * FROM SomeTable
WHERE[/span
//Either one or both of 下面的陳述句可以評估to TRUE。
//to評估整個WHERE謂詞to為真。
//However, both Ifs需要to被檢查and not跳過。
If(@ProductID <> 1) THEN (T1 AND T2)
如果(@ProductType = 2) THEN (T3 AND T4)
對我來說,問題在于WHERE陳述句。WHERE 1 = (CASE....THEN 1) ELSE 0不起作用,因為一旦第一個If陳述句被執行,它就結束了CASE,但我需要執行兩個If陳述句。另一種方式,WHERE ((@ProductID <> 1) AND (T1 AND T2)) OR ((@ProductType = 2) AND (T3 AND T4))也不會起作用,因為SQL Server優化器可以將OR短路,跳過第二個If陳述句。
編輯:為了消除一些混淆。T1-4是謂詞。我想把WHERE子句中的整個謂詞評估為TRUE,只要一個或所有If陳述句(以及它在THEN中的謂詞)被評估為TRUE。但是,與此同時,我希望所有的Ifs都被檢查。就像在順序代碼中,當序列的If陳述句被評估時,
uj5u.com熱心網友回復:
你只需要在你的T*術語的布爾比較中包括條件:
where
(@ProductID <> 1 AND T1 AND T2)
OR
(@ProductType = 2 AND T3 AND T4)
uj5u.com熱心網友回復:
我不知道T1 AND T2和T3 AND T4如何轉化為條件。但是為了包括這兩個條件,你把邏輯翻過來,允許你使用AND。
SELECT *
FROM MyTable
WHERE[/span
-- 所以,如果@ProductID = 1,我們就短路離開這個分支,否則我們就應用(T1 AND T2)。
(@ProductID = 1 OR (T1 AND T2))
AND (T1 class="hljs-keyword">AND T2)
-- 如果@ProductID !=2,我們就短路離開這個分支,否則就應用(T3 AND T4)。
(@ProductID <> 2 OR (T3 AND T4))
即使經過你的編輯,我仍然認為這是正確的 - 我建議你創建一個最小的可重復的例子來證明。但讓我試著澄清一下。所以你原來的第一行是 If(@ProductID <> 1) THEN (T1 AND T2) 現在如果你看看我的第一行,如果 @ProductId = 1 那么第一行就自動為真,而不需要測驗 T1 AND T2 - 這是你想要的邏輯,因為你只想在 @ProductId <> 1 時執行測驗T1 AND T2。
因此,第一行要么在@ProductId = 1的情況下為真,要么在T1 AND T2的情況下為真--這正是你所要求的(如圖)。
所以你的關鍵要求是確保第二行也被測驗,因此你必須使用AND。然后,同樣的原則適用于第二行。如果If(@ProductType = 2),你就執行測驗T3 AND T4,否則就不執行。因為當@ProductType <> 2時,第二個條件自動為真,所以在這種情況下忽略T3 AND T4。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/328422.html
標籤:
上一篇:SQL將兩行合并為一行
