2

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

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

/* or */

select * from products 
where condition

)

我在想的是,如果有时你有一个搜索字符串或没有。您如何在 cte 中考虑到这一点?

或者,在一个程序中使用 2 个 cte 可能是一个更好的主意?

4

2 回答 2

5

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

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

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

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

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

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

于 2012-11-03T15:26:01.317 回答
1

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

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 中选择 *

于 2015-04-10T12:30:48.833 回答