CTE后使用CASE WHEN

时间:2018-07-16 07:16:45

标签: sql sql-server tsql common-table-expression case-when

我正尝试在CTE定义之后使用CASE WHEN,但是查询只希望使用SELECT

WITH A AS
(...) --long query here
CASE WHEN @parameter = '' THEN
SELECT * FROM A 
ELSE
SELECT * FROM A WHERE field like '%' + @parameter + '%'
END

除了使用OR语句以外,是否还有其他方法可以使该查询正常工作?

2 个答案:

答案 0 :(得分:1)

首先,您使用CASE WHEN错误。作为选择子句的一部分,应该使用它返回单个值而不是表。它不打算用作运行两个查询之一的流控制。为此使用IF。

第二,您不能从选择中拆分CTE,它是同一条语句的一部分。您不能去“这里是CTE,现在从中运行两个语句之一”,这不是CTE语句的编写方式。您可以在一个选择中多次重用CTE,但是将运行整个选择,而不仅仅是部分选择。

一些可行的替代方式

您可以在整个查询中使用IF,并将其写两次。这样,只有一个版本的查询实际运行。

IF @parameter = ''
    SELECT (your query here)
ELSE
    SELECT (your query here) WHERE field like ...

您可以使用动态SQL,将查询的第一部分构建为字符串。然后仅在需要时添加where子句,然后运行生成的SQL。

答案 1 :(得分:1)

您可以在OR子句中使用WHERE

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE (field like '%' + @parameter + '%') OR @parameter = '';

如果field从未为NULL,那么这等效于:

WITH A AS
    (...) --long query here
SELECT *
FROM A
WHERE field like '%' + @parameter + '%';

({LIKE '%%'与任何非空字符串匹配。)