SQL Server中的ALL与ANY评估

时间:2014-10-24 15:40:17

标签: sql-server sql-server-2008-r2

我现在只是尝试下面的查询:

SELECT DISTINCT code,
                CASE
                  WHEN id = ANY (SELECT DISTINCT u.id
                                 FROM   unit u
                                        LEFT JOIN unit_const uc
                                               ON u.id = uc.hid
                                 WHERE  u.property = 502
                                        AND type = 'Acq') THEN 1
                  ELSE 0
                END                       AS Case_Eval,
                (SELECT DISTINCT u.id
                 FROM   unit u
                        LEFT JOIN unit_const uc
                               ON u.id = uc.hid
                 WHERE  u.property = 502
                        AND type = 'Acq') AS Evaluation
FROM   unit
WHERE  property = 502 

正确地给出了以下结果:

+---------------------------------------+
| Code       Case_Eval   Evaluation     |
+---------------------------------------+
| TP2_U1     0           NULL           |
| TP2_U2     0           NULL           |
| TP2_U3     0           NULL           |
| TP2_U4     0           NULL           |
+---------------------------------------+

但如果我从ANY切换到ALL,那么CASE语句将被评估为1。

+---------------------------------------+
| Code       Case_Eval   Evaluation     |
+---------------------------------------+
| TP2_U1     1           NULL           |
| TP2_U2     1           NULL           |
| TP2_U3     1           NULL           |
| TP2_U4     1           NULL           |
+---------------------------------------+

但是正如您所看到的那样,返回CASE中要比较的值的SELECT语句始终为NULL

CASE语句如何将此值评估为true?单位ID不是NULL(对于4个单位,它们分别是601,602,603和604),那么与ALL(NULL)相比的结果是什么?

我的理解是否有不正确之处?

根据ALL documentation,它会将标量值计算为值列表。

如果出现以下情况,则返回true:

" 当所有对(scalar_expression,x)指定的比较为TRUE时返回TRUE,当x是单列集中的值时;否则返回FALSE。"

如何配对(601,NULL)评估为True?

1 个答案:

答案 0 :(得分:3)

SELECT DISTINCT u.id
FROM   unit u
       LEFT JOIN unit_const uc
         ON u.id = uc.hid
WHERE  u.property = 502
       AND type = 'Acq' 

上述语句必须返回零行。不是空的。当以标量方式使用时(与“评估”列一样),返回零行的子查询的值为NULL,但子查询本身不会返回该值。

SQL标准定义了ALLANY(AKA SOME)在与空集进行比较时的不同行为。

对于ALL,比较评估为true

If T is empty or if the implied <comparison predicate> is true for every row RT 
in T, then "R <comp op> <all> T" is true.

这是按照经典逻辑,如果房间有空间,“房间里的所有手机都关闭”和“房间里的所有手机都打开”都被视为真实(though vacuously)没有手机。

对于Any / Some,必须至少有一对实际匹配。

SQL标准的相关位于下方。

If T is empty or if the implied <comparison predicate> is false for every row RT 
in T, then "R <comp op> <some> T" is false.