是一个子查询,它返回没有行,等于NULL?

Ari*_*MAZ 0 sql sql-server select

在SQL Server中,如果SELECT子查询中的语句没有返回任何行,那么子查询的结果是否等于NULL?我做了一些研究,但我不确定.

例:

IF (SELECT TOP 1 CLMN1 FROM SOMETABLE) IS NOT NULL THEN
   ....
Run Code Online (Sandbox Code Playgroud)

我要求了解上面if语句的行为.

Jua*_*uan 8

看起来答案是肯定的:

 DECLARE @Test TABLE (Id INT)
 INSERT INTO @Test VALUES (1)

 SELECT * FROM @Test WHERE Id = 2
 SELECT CASE WHEN (SELECT * FROM @Test WHERE Id = 2) IS NULL THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

编辑:在你更新你的问题后,我想我应该添加,而不是检查是否有IS NULL的行,你应该使用以下可以由服务器更好地优化:

IF EXISTS(SELECT * FROM @Test WHERE Id = 2)
BEGIN
   -- Whatever
END 
Run Code Online (Sandbox Code Playgroud)

  • +1 - 哇,我没有以这种方式想到这个问题(在编辑之前),但是你是正确的,SQL Server 在比较测试中将空结果集视为 NULL。请注意,这样的构造非常危险,因为如果您返回超过 1 行,您将收到可怕的“子查询返回超过 1 个值”错误... (2认同)