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