2012-11-03 84 views
2

這可能是一個壞主意,但只是想知道?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在一個過程?

+0

這有注意到CTE。 – Lucero

回答

5

如果你正在傳遞一個搜索字符串作爲參數,你可以檢查它爲空或不是都在一個聲明。例如:

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在開始時經常看起來很聰明和優雅,但是當更多的選項變得更糟時,更經常被視爲最後的手段。

+0

實際上,對於可能或不可能有過濾條件的'捕獲所有'類型的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/ –

+0

好東西。該鏈接文章更詳細,並指出了2008年的一些更多考慮因素。如果你作出答覆,我會贊成。 –

1

表變量也可能幫助你。檢查是否有幫助..

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