我明白了
IF EXISTS(SELECT NULL) PRINT 'TRUE';
将总是打印TRUE
,因为毕竟NULL
是SQL Server中的一个值,但是为什么这个
IF EXISTS(SELECT NULL) PRINT 'TRUE'
打印TRUE
作为子查询将导致错误,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 (my bold):
如果
<select list> "*"
只是包含在<subquery>
中然后,它立即包含在<exists predicate>
中<select list>
等价于<value expression>
是一个任意的<literal>
。
所以,这意味着你可以在EXISTS位中有任何旧的垃圾:它应该被忽略