【问题标题】:Why select IN doesnt work properly when there are nulls为什么有空值时选择IN不能正常工作
【发布时间】:2021-10-02 12:46:31
【问题描述】:

为什么这会返回 EXASOL DBMS 中的记录

SELECT a, b FROM (SELECT NULL AS a, 'b' AS b) t
WHERE (a, b) NOT IN (SELECT NULL, 'b') 

?

谢谢,拉斐尔。

【问题讨论】:

  • 您的确切 SQL 数据库是什么,以及您在上面发布的查询的结果是什么?
  • 因为(NULL = NULL) <> True

标签: sql database select in-clause exasol


【解决方案1】:

因为(NULL = NULL) <> True


create table three(
        one integer
        );

INSERT INTO three(one) VALUES(1),(2),(NULL);

SELECT one.one AS one
        , two.one AS two
        , one.one = two.one AS diff
FROM three one
CROSS JOIN three two
        ;

结果:

CREATE TABLE
INSERT 0 3
 one | two | diff 
-----+-----+------
   1 |   1 | t
   1 |   2 | f
   1 |     | 
   2 |   1 | f
   2 |   2 | t
   2 |     | 
     |   1 | 
     |   2 | 
     |     | 
(9 rows)

因此,将任何内容与 NULL 进行比较都会导致 NULL,不是真或假。

在您的情况下,您是在比较元组,而不是标量。对于元组,情况更糟:如果其中一个元组的任何元素为 NULL,则比较结果既不是 True 也不是 False。

【讨论】:

  • 根据 SQL 比较 null 和 null 的结果是 UNKNOWNWHERE 子句要求谓词评估为 TRUE 以包含要包含的行,而不是 FALSE,而不是 UNKNOWN
猜你喜欢
  • 1970-01-01
  • 2014-01-06
  • 2016-07-16
  • 2019-01-04
  • 2020-09-03
  • 2016-10-10
  • 2016-10-24
  • 2017-02-27
  • 2017-07-08
相关资源
最近更新 更多