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在一个过程?
如果你正在传递一个搜索字符串作为参数,你可以检查它为空或不是都在一个声明。例如:
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