在 CTE 之后使用 CASE WHEN

using CASE WHEN after CTE

我试图在 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 语句之外,还有什么方法可以让这个查询生效吗?

首先,你使用的CASE WHEN是错误的。它应该用于 return 单个值,而不是 table,作为例如 select 子句的一部分。它不打算用作 运行 两个查询之一的流量控制。为此使用 IF。

其次,您不能将 CTE 从 select 中拆分出来,它是同一语句的一部分。你不能去 "Here is a CTE, now run one of two statements from it",那不是 CTE 语句的编写方式。您可以在 select 中多次重复使用 CTE,但要 运行 整个 select,而不仅仅是其中的一部分。

一些可行的替代方法

您可以在整个查询周围使用 IF,并将其写出两次。这样查询实际上只有一个版本 运行s.

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

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

您可以在 WHERE 子句中使用 OR

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 '%%' 匹配任何非空字符串。)