这可能是一个坏主意,但只是想知道?
;with Products
AS
(
/* can you have an if statement in here? */
select * from products
/* or */
select * from products
where condition
)
我在想的是,如果有时你有一个搜索字符串。你如何在cte中考虑这个问题?
或者在一个程序中获得2个cte可能更好一点?
答案 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
中选择*