当查询中存在 IF 条件时,CTE 不起作用

Posted

技术标签:

【中文标题】当查询中存在 IF 条件时,CTE 不起作用【英文标题】:CTEs not working when theres IF condition in the query 【发布时间】:2012-03-29 03:27:38 【问题描述】:

我正在尝试在我的查询中添加功能以选择将在特定条件下执行的查询。

DECLARE @Test VARCHAR(50)
    SET @Test = 'A'

;WITH A AS (
  Select 'A is Selected' as SELECTED),
      B AS (
  Select 'B is Selected' as SELECTED)

IF(@Test = 'A')
  select * from A

IF(@Test <> 'A')
  select * from B

根据我上面的示例测试代码,我得到了:

消息 319,第 15 级,状态 1,第 5 行 关键字“with”附近的语法不正确。如果该语句是公用表表达式或 xmlnamespaces 子句,则前面的语句必须以分号结束。

消息 102,第 15 级,状态 1,第 8 行 ',' 附近的语法不正确。

也许我错过了什么?

【问题讨论】:

CTE 附加到 SELECT、INSERT、UPDATE 或 DELETE 语句——您的示例中没有这些。条件逻辑不算... 为了获得最佳答案,您应该发布生成错误的代码。这会给你Incorrect syntax near the keyword 'IF'. 【参考方案1】:

来自WITH common_table_expression (Transact-SQL)。

在单个SELECT、INSERT、UPDATE的执行范围内定义, 或 DELETE 语句。

我猜你想要这样的东西。

declare @Test varchar(50);
set @Test='A';

with A as
(
  select 'A is Selected' as SELECTED
),
B as
(
  select 'B is Selected' as SELECTED
)
select *
from A
where @Test = 'A'    
union all
select *
from B
where @Test = 'B';

【讨论】:

如果有CTE就不能使用IF函数? @BizApps 您不能在查询中使用 iF。您可以使用 IF 来控制应该执行哪些查询,但 CTE 是 ONE 查询的一部分,因此您不能使用 IF 来控制要使用的 CTE。【参考方案2】:

在我看来,您应该简单地将两个查询放在一个 IF 语句中,如下所示:

IF (@Test = 'A')
  select * from A
ELSE
  select * from B

【讨论】:

实际上,您可以有多个 CTE 定义,用逗号分隔 - 这绝对是不是的问题! 我想我只是看不到像那样加入他们的必要性。

以上是关于当查询中存在 IF 条件时,CTE 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 类别 if 条件不起作用

当我在公式中添加 WHERE 时查询功能不起作用

在 XCUITest 中使用条件似乎不起作用

SQL 查询不起作用 - 使用 Where 条件不匹配

当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 它不起作用

如果不存在在 Windows 批处理中不起作用