0

我明白这

IF EXISTS(SELECT NULL) PRINT 'TRUE';

总是会打印TRUE,因为毕竟NULL是 SQL Server 中的一个值,但为什么会这样

IF EXISTS(SELECT NULL) PRINT 'TRUE'

printTRUE因为子查询会导致错误并EXISTS始终检查是否存在,所以这是怎么可能的。

4

1 回答 1

5

猜测是因为您的问题中有复制/粘贴错误

EXISTS 不检查值。它检查行。

所以这些是有效的,因为 SELECT 给出了一行

IF EXISTS(SELECT 1/0) PRINT 'TRUE' 
IF EXISTS(SELECT NULL) PRINT 'TRUE';
IF EXISTS(SELECT CAST('fish' AS int)) PRINT 'TRUE';

为了解释,我们将查看ANSI-92 SQL,搜索“ Query expressions 191”。

这是案例 3a(我的粗体):

如果<select list> "*"a 简单地包含在 a<subquery> 中,即立即包含在 an 中<exists predicate>,则 the<select list>等价于 a<value expression>任意 <literal>的。

因此,这表示您可以在 EXISTS 位中包含任何旧垃圾:应该忽略它

于 2011-08-05T10:24:42.600 回答