我明白这
IF EXISTS(SELECT NULL) PRINT 'TRUE';
总是会打印TRUE
,因为毕竟NULL
是 SQL Server 中的一个值,但为什么会这样
IF EXISTS(SELECT NULL) PRINT 'TRUE'
printTRUE
因为子查询会导致错误并EXISTS
始终检查是否存在,所以这是怎么可能的。
我明白这
IF EXISTS(SELECT NULL) PRINT 'TRUE';
总是会打印TRUE
,因为毕竟NULL
是 SQL Server 中的一个值,但为什么会这样
IF EXISTS(SELECT NULL) PRINT 'TRUE'
printTRUE
因为子查询会导致错误并EXISTS
始终检查是否存在,所以这是怎么可能的。
猜测是因为您的问题中有复制/粘贴错误
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 位中包含任何旧垃圾:应该忽略它