我现在只是尝试下面的查询:
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?
答案 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标准定义了ALL
和ANY
(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.