在使用公共表达式(CTE)时如何使用IF EXISTS

15

我想检查一个CTE表是否有记录或者为空。但是我总是得到以下SQL错误消息:“关键字'IF'附近的语法不正确”。现在ADMISSION_OUTSIDE TABLE中没有匹配的记录。 SQL的结果应该打印“NOT OK”。谢谢。

WITH ADMISSION_OUTSIDE AS 
(   .....
.....
)

IF EXISTS (SELECT * FROM ADMISSION_OUTSIDE)
PRINT 'OK'
ELSE PRINT 'NOT OK'

8
CTE应该跟随着SELECT, INSERT, UPDATE或DELETE语句。 - Vamsi Prabhala
也许你在这里有点混淆了。那不是正确的语法,可能也不是CTE的正确用法。也许你只想将查询内容放在一个表变量中的CTE中。请注意,在CTE定义后面的命令中,你没有将CTE纳入范围。 - jean
你只是打印来调试查询吗?还是你也想从中选择数据? - D Stanley
CTE相对于子查询的好处主要在于它的结果集可以在SELECT/INSERT/UPDATE/DELETE语句中被重复使用,例如Prdp的回答。但也许你应该看看使用游标能够实现什么。 - LukStorms
5个回答

22

来自MSDN

CTE 必须后跟一个单一的 SELECT、INSERT、UPDATE 或 DELETE 语句,该语句引用了所有或部分 CTE 列。

可以像这样重新编写

WITH ADMISSION_OUTSIDE AS 
(   .....
.....
)
SELECT 'OK' WHERE EXISTS (SELECT * FROM ADMISSION_OUTSIDE)
UNION ALL
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM ADMISSION_OUTSIDE)

这是一个演示

;WITH CTE AS
(
SELECT 1 as a WHERE 1=0
)
SELECT 'OK' WHERE EXISTS (SELECT * FROM CTE)
UNION ALL
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM CTE)

结果 : 不合格

;WITH CTE AS
(
SELECT 1 as a WHERE 1=1
)
SELECT 'OK' WHERE EXISTS (SELECT * FROM CTE)
UNION ALL
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM CTE)

结果: OK


我得到了空值。 - Ice
@Ice - 已添加演示 - Pரதீப்
如果您不喜欢使用 UNION,可以使用 case 语句代替,例如:SELECT case when exists (SELECT * FROM CTE) then 'OK' else 'NOT OK' end - Rory

6
我认为这也是检查值的存在性并执行操作的最简单方法之一。
WITH ADMISSION_OUTSIDE AS 
(   .....
.....
)
SELECT CASE WHEN (SELECT COUNT(1) tot 
                  FROM ADMISSION_OUTSIDE) > 0 THEN 'OK' ELSE 'NOT OK' END

1
当 EXISTS 找到匹配项时,它将停止读取数据。COUNT 将读取与谓词相对应的所有行。一般来说,EXISTS 更有效率。 - Michael Green
你认为“检查CTE表是否有记录或为空”不是一个合适的答案吗? - Shushil Bohara

4
有一点巧妙,但您可以这样做:
declare @x bit

;WITH CTE AS
(
  SELECT 1 As 'column1'
)
SELECT @x = ISNULL(column1,0) from cte

If @x=1
begin
...
end

0

由于必须使用with语句结果跟随with语句,因此不允许使用除with语句结果以外的任何其他语句。

请参阅更多信息:无法在WITH语句之后删除表


0

SQL Server返回该错误消息(“语法不正确”),因为它不是有效的语句。

通用表达式(CTE)本身不是单独的语句。它是另一个语句的一部分,可以是SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句中的一个表达式

https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接