這可能是一個壞主意,但只是想知道?sql cte if語句
;with Products
AS
(
/* can you have an if statement in here? */
select * from products
/* or */
select * from products
where condition
)
我在想什麼,如果有時你有一個搜索字符串或不。你如何在cte中進行考慮?
或者,也許這將是一個更好的主意,有2 CTE在一個過程?
這可能是一個壞主意,但只是想知道?sql cte if語句
;with Products
AS
(
/* can you have an if statement in here? */
select * from products
/* or */
select * from products
where condition
)
我在想什麼,如果有時你有一個搜索字符串或不。你如何在cte中進行考慮?
或者,也許這將是一個更好的主意,有2 CTE在一個過程?
如果你正在傳遞一個搜索字符串作爲參數,你可以檢查它爲空或不是都在一個聲明。例如:
select *
from MyTable
where MyColumn = @SearchString
or @SearchString is null;
這將返回與參數不爲空時相匹配的記錄,並在其爲空時返回所有記錄。
作爲另一種選擇,你可以隨時把case
陳述你的where子句。
除此之外,如果您確實需要不同的查詢,您當然可以用if
進行分支,但是您聲明CTE後,您的查詢必須是下一個語句。因此,您必須在if語句的每個分支中都有一份副本或您的CTE和查詢。
如果你正在考慮傳遞一個完整的where子句,並將其全部作爲動態SQL(編輯:意味着一個非參數化的連接字符串,而不是ORM類型的sp_executesql),我會嘗試重構以使用上述任何一種方法第一,因爲有inherent problems with dynamic SQL。動態SQL在開始時經常看起來很聰明和優雅,但是當更多的選項變得更糟時,更經常被視爲最後的手段。
實際上,對於可能或不可能有過濾條件的'捕獲所有'類型的queires:動態sql是一個非常好的實現。其他方法(例如WHERE([foo] = [at] bar或[at] bar IS NULL)和..)會導致性能較差,因爲爲第一次運行緩存的查詢計劃可能完全錯誤第二。如果您使用動態sql並在這種情況下使用sp_executeSql,那麼您可以保證搜索的每個排列都會得到自己的(可重用的計劃) - 請查看http://sqlinthewild.co.za/index.php/2009/ 03/19/catch-all-queries/ –
好東西。該鏈接文章更詳細,並指出了2008年的一些更多考慮因素。如果你作出答覆,我會贊成。 –
表變量也可能幫助你。檢查是否有幫助..
DECLARE @tbl表(ID INT,VARCHAR名(500),....)
如果< @booleanexpression = 1> INSERT INTO @tbl SELECT * FROM產品 否則 INSERT INTO @tbl SELECT * FROM產品WHERE條件..
與CTE爲 (SELECT * FROM @tbl)
SELECT * FROM CTE
這有注意到CTE。 – Lucero