所有与任何评估在SQL Server中

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

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切换到ALLCASE语句的计算结果为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声明如何评估这是真实的? 单位ID不是NULL (对于4个单位,它们分别是601,602,603和604),那么与ALL(NULL)相比如何得到结果为真?

我的理解有什么不正确吗?

根据所有文档,它会将一个标量值评估为一系列值。

如果符合以下条件,则返回true

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

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


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。 返回零行的子查询在以标量方式使用时的赋值为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.

这是按照古典逻辑,如果房间里没有手机,那么“房间里的所有手机都关掉”和“房间里的所有手机都开着”这两种说法都被认为是真实的(尽管真实)。

对于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.
链接地址: http://www.djcxy.com/p/23183.html

上一篇: ALL vs ANY evaluation in SQL Server

下一篇: Attach generated PDF in Mailgun message Django/Python