我明白这个
IF EXISTS(SELECT NULL) PRINT 'TRUE';
总是打印TRUE
,因为毕竟NULL
是SQL Server中的值,但为什么会这样
IF EXISTS(SELECT NULL) PRINT 'TRUE'
打印TRUE
因为子查询会导致错误,EXISTS
总是会检查是否存在,所以为什么会这样。
答案 0 :(得分: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> "*"
只包含在<subquery>
中 然后,它立即包含在<exists predicate>
中<select list>
相当于<value expression>
是任意<literal>
。
所以,这表示你可以在EXISTS位中找到任何旧的垃圾:它应该被忽略