我正尝试在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
语句以外,是否还有其他方法可以使该查询正常工作?
答案 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 '%%'
与任何非空字符串匹配。)