Rad*_*hiu 7 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
Run Code Online (Sandbox Code Playgroud)
这正确地给出了以下结果:
+---------------------------------------+
| Code Case_Eval Evaluation |
+---------------------------------------+
| TP2_U1 0 NULL |
| TP2_U2 0 NULL |
| TP2_U3 0 NULL |
| TP2_U4 0 NULL |
+---------------------------------------+
Run Code Online (Sandbox Code Playgroud)
但是如果我从那时切换ANY到ALL那么CASE语句被评估为1.
+---------------------------------------+
| Code Case_Eval Evaluation |
+---------------------------------------+
| TP2_U1 1 NULL |
| TP2_U2 1 NULL |
| TP2_U3 1 NULL |
| TP2_U4 1 NULL |
+---------------------------------------+
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的SELECT语句返回值在被比较CASE是NULL所有的时间.
该CASE声明如何评估为真?单位ID不是NULL(它们是4个单位的601,602,603和604),那么如果比较ALL(NULL)结果是真的吗?
我的理解中有什么不对的地方吗?
根据ALL文档,它会将标量值计算为值列表.
并在以下情况下返回true:
" 当所有对(scalar_expression,x)指定的比较为TRUE时返回TRUE,当x是单列集合中的值时;否则返回FALSE. "
如何配对(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'
Run Code Online (Sandbox Code Playgroud)
上述语句必须返回零行。不为空。返回零行的子查询NULL在以标量方式使用时被赋予一个值(与“Evaluation”列一样),但子查询本身不返回该值。
SQL 标准在与空集进行比较时定义了ALL和ANY(又名)的不同行为。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.
Run Code Online (Sandbox Code Playgroud)
这是按照经典逻辑,如果房间里没有手机,那么“房间里的所有手机都关闭”和“房间里的所有手机都打开”这句话都被认为是正确的(尽管是空洞的)。
对于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.
Run Code Online (Sandbox Code Playgroud)