这可能是一个坏主意,但只是想知道?
;with Products
AS
(
/* can you have an if statement in here? */
select * from products
/* or */
select * from products
where condition
)
我在想的是,如果有时你有一个搜索字符串或没有。您如何在 cte 中考虑到这一点?
或者,在一个程序中使用 2 个 cte 可能是一个更好的主意?
这可能是一个坏主意,但只是想知道?
;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
BUT 进行分支,但您的查询必须是声明 CTE 后的下一条语句。因此,您必须在 if 语句的每个分支中都有一份副本或您的 CTE 和查询。
如果您正在考虑传递整个 where 子句并将其全部作为动态 SQL 运行(编辑:意思是非参数化的连接字符串,而不是 ORM 类型的 sp_executesql),我会尝试重构以首先使用上述任何方法,如动态 SQL存在固有问题。动态 SQL 一开始通常看起来很聪明和优雅,但更多时候应该将其视为最后的手段,只有当其他选项以某种方式变得更糟时。
表变量也可能对您有所帮助。检查它是否有帮助..
DECLARE @tbl TABLE(id int,name varchar(500), .... )
if <@booleanexpression = 1> INSERT INTO @tbl select * from products else INSERT INTO @tbl select * from products where condition..
使用 cte 作为(从 @tbl 中选择 *)
从 cte 中选择 *