【发布时间】:2020-04-14 08:40:50
【问题描述】:
考虑这个查询:
SELECT
1 IN (
SELECT 1 FROM SYSIBM.dual WHERE FALSE
) AS a,
1 IN (
SELECT NULL FROM SYSIBM.dual WHERE FALSE
) AS b
FROM SYSIBM.dual;
两个谓词都检查常量值是否在空集中。唯一的区别是其中一个空集有一个 NULL 文字,在我看来是无关紧要的。两个结果都应该是FALSE,因为空集中没有任何值。但是,我得到了这个:
A|B|
-|-|
0| |
A 是 FALSE,正如预期的那样,但 B IS NULL,这没有任何意义。使用CAST(NULL AS INT) 不会改变任何东西,以防这可能是因为未知数据类型。这种行为是否有合理的解释或者这是一个错误? MySQL 和 PostgreSQL 都为 B 返回 FALSE。
-- PostgreSQL:
SELECT
1 IN (
SELECT 1 WHERE FALSE
) AS a,
1 IN (
SELECT CAST(NULL AS INT) WHERE FALSE
) AS b
-- MySQL:
SELECT
1 IN (
SELECT 1 WHERE FALSE
) AS a,
1 IN (
SELECT NULL WHERE FALSE
) AS b
一个更简单的示例暴露了一个类似的错误(可能与 Db2 的 BOOLEAN 类型的有缺陷的实现有关一般):
SELECT NULL OR FALSE AS a, FALSE OR NULL AS b FROM SYSIBM.dual;
产生:
A|B|
-|-|
0| |
显然是另一个错误。 OR 中操作数的顺序无关紧要。
我正在使用 Db2 LUW v11.5.0.0
【问题讨论】:
-
这是一个错误。 A 和 B 都应该是 FALSE。
-
不,这是条件检查而不是数据选择,这只是其他数据库中的错误语法,尽管您的 db2 可能出于调试目的支持该语法。尝试在 oracle 中运行相同的语法,否则您会得到错误的语法或尝试
select from.. Where your condition它不会给出任何记录 -
@HimanshuAhuja:完全可以模仿其他方言的语法。但这不是这个问题的目的。
-
您能向 IBM 支持部门提出这个问题吗?
-
很公平。我将在 IBM 内部接受您的观察