sql cte if语句

时间:2012-11-03 15:15:41

标签: sql sql-server sql-server-2008

这可能是一个坏主意,但只是想知道?

;with Products
AS
(
/* can you have an if statement in here? */
select * from products

/* or */

select * from products 
where condition

)

我在想的是,如果有时你有一个搜索字符串。你如何在cte中考虑这个问题?

或者在一个程序中获得2个cte可能更好一点?

2 个答案:

答案 0 :(得分:5)

如果您将搜索字符串作为参数传入,则可以在一个语句中检查它是否为空。例如:

select *
from MyTable
where MyColumn = @SearchString
    or @SearchString is null;

这将返回参数不为null时匹配的记录,并返回空值时的所有记录。

作为另一种选择,您始终可以在where子句中添加case语句。

除此之外,如果你确实需要不同的查询,你当然可以用if分支,但是在你宣布CTE之后你的查询必须是下一个语句。因此,您必须在if语句的每个分支中都有一个副本或CTE和查询。

如果您正在考虑传递整个where子句并将其全部作为动态SQL运行(编辑:表示非参数化连接字符串,而不是ORM类型sp_executesql),我会尝试重构以使用上述任何方法首先,因为有inherent problems with dynamic SQL。动态SQL在开始时通常看起来很聪明和优雅,但只有当其他选项在某种程度上变得更糟时,才会被视为最后的手段。

答案 1 :(得分:1)

表变量也可能对您有所帮助。检查它是否有帮助..

DECLARE @tbl TABLE(id int,name varchar(500),....)

如果< @booleanexpression = 1>     INSERT INTO @tbl select * from products 其他     INSERT INTO @tbl select * from products where condition ..

用cte作为     (从@tbl中选择*)

从cte

中选择*