【发布时间】:2014-10-24 15:40:17
【问题描述】:
我现在正在尝试以下查询:
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 语句如何将其评估为真?单位ID不是NULL(4个单位分别是601、602、603和604),那么与ALL(NULL)相比,结果如何?
我的理解有什么不对吗?
根据ALL documentation,它将标量值评估为值列表。
如果满足以下条件,则返回 true:
"当指定的比较对所有对 (scalar_expression, x) 为 TRUE 时返回 TRUE,当 x 是单列集中的值时;否则返回 FALSE。"
pair(601, NULL) 如何计算为 True?
【问题讨论】:
-
+1 用于介绍一些我从未意识到存在于 T-SQL 中的语法!
标签: sql-server sql-server-2008-r2