【问题标题】:SQL Server Exists predicateSQL Server 存在谓词
【发布时间】:2011-08-05 10:05:40
【问题描述】:
我明白这个
IF EXISTS(SELECT NULL) PRINT 'TRUE';
总是会打印TRUE,因为毕竟NULL是SQL Server中的一个值,但为什么会这样
IF EXISTS(SELECT NULL) PRINT 'TRUE'
打印TRUE,因为子查询会导致错误,EXISTS 总是检查是否存在,所以这是怎么可能的。
【问题讨论】:
标签:
tsql
sql-server-2008r2-express
【解决方案1】:
猜测是因为您的问题中有复制/粘贴错误
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 位中包含任何旧垃圾:应该忽略它