Рассмотрим этот запрос:
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 возвращают FALSE
для B
.
-- 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
Более простой пример демонстрирует похожую ошибку (возможно, связанную с ошибочной реализацией типа BOOLEAN
Db2 в general ):
SELECT NULL OR FALSE AS a, FALSE OR NULL AS b FROM SYSIBM.dual;
Который производит:
A|B|
-|-|
0| |
Очевидно, еще одна ошибка. Порядок операндов в OR
не должен иметь значения.
Я использую Db2 LUW v11.5.0.0