sql cte if语句

sql cte if语句

问题描述:

这可能是一个坏主意,但只是想知道?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

如果你正在传递一个搜索字符串作为参数,你可以检查它为空或不是都在一个声明。例如:

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年的一些更多考虑因素。如果你作出答复,我会赞成。 –

表变量也可能帮助你。检查是否有帮助..

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