【为什么用pg数据库用 != null 过滤不出null值】

在 PostgreSQL 中,使用 != null 过滤不出 NULL 值的原因与 SQL 标准中 NULL 的特殊性质有关。以下是详细解释:


1. NULL 的特殊性质

  • NULL 表示“未知”或“不存在”,它不是具体的值,而是一个状态。
  • 在 SQL 中,任何与 NULL 的比较操作(如 =, !=, >, < 等)都会返回 UNKNOWN,而不是 TRUEFALSE
  • 由于 UNKNOWN 在条件判断中被视为 FALSE,因此 != null 无法过滤出 NULL 值。

2. 为什么 != null 无效

  • 当你写 column != NULL 时,PostgreSQL 会将其解释为 column <> NULL
  • 根据 SQL 标准,NULL 与任何值(包括 NULL 本身)的比较结果都是 UNKNOWN
  • 因此,column != NULL 永远不会返回 TRUE,也就无法过滤出 NULL 值。

3. 正确的过滤 NULL 的方式

在 PostgreSQL 中,过滤 NULL 值的正确方式是使用 IS NULLIS NOT NULL

示例
  • 过滤出 NULL 值:

    SELECT * FROM table_name WHERE column_name IS NULL;
    
  • 过滤出非 NULL 值:

    SELECT * FROM table_name WHERE column_name IS NOT NULL;
    

4. 为什么 IS NULLIS NOT NULL 有效

  • IS NULLIS NOT NULL 是专门用于检查 NULL 值的操作符。
  • 它们直接判断某个列是否为 NULL,而不是进行值比较,因此可以正确处理 NULL

5. 示例对比

假设有一张表 users,其中 email 列包含 NULL 值:

id email
1 alice@example.com
2 NULL
3 tygh.soon@foxmail.com
  • 错误的方式

    SELECT * FROM users WHERE email != 'alice@example.com';
    

    结果:

    id email
    3 tygh.soon@foxmail.com
    • 这里 NULL 值被排除在外,因为 NULL != 'alice@example.com' 返回 UNKNOWN
  • 正确的方式

    SELECT * FROM users WHERE email IS NULL;
    

    结果:

    id email
    2 NULL

6. 总结

  • 在 PostgreSQL 中,!= NULL 无法过滤出 NULL 值,因为 NULL 与任何值的比较都会返回 UNKNOWN
  • 正确的做法是使用 IS NULLIS NOT NULL 来过滤 NULL 值。
  • 这是 SQL 标准的一部分,适用于所有符合 SQL 标准的数据库(如 PostgreSQL、MySQL、Oracle 等)。

Powered By DeepDeek