這是Slow Exists Check的續作。亞歷克斯的建議工作,併成功地避免代碼重複,但我仍然結束了第二個問題。考慮下面的例子(來自AlexKuznetsov)。其中,我有兩個分支來處理1次違禁。如果我有兩個可選的約束條件,我最終會得到4個分支。基本上,分支的數量隨着約束的數量呈指數增長。另一方面,如果我使用多語句表值函數或使用臨時表,SQL查詢優化器不能幫助我,所以事情變得緩慢。我對動態SQL有些不信任(我也聽說它也很慢)。有效處理Where子句中的多個可選約束條件
任何人都可以提供有關如何添加更多約束而不添加大量if語句的建議?
說明:我以前試過把x is null or inpo = @inpo
連在一起,但是這個很慢。請記住,雖然inpo = @inpo
測試可以通過某種索引黑魔法來處理,但無效測試最終將針對表中的每一行進行評估。
IF @inpo IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END
變化二:2約束:
IF @inpo IS NULL BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo2 = @inpo2
ORDER BY c;
END
END ELSE BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo AND
inpo2 = @inpo2
ORDER BY c;
END
END
很棒的發現。獲取我的+1 – 2009-07-08 22:16:57
優秀的參考+1 – 2009-07-08 22:20:58