odoo-061 PostgreSQL 中处理 NULL 值的 SQL 条件写法

文章目录

  • [1. 检查是否为 NULL](#1. 检查是否为 NULL)
  • [2. NULL 值与比较运算符](#2. NULL 值与比较运算符)
  • [3. 在聚合函数中处理 NULL](#3. 在聚合函数中处理 NULL)
  • [4. 在 WHERE 子句中的复杂条件](#4. 在 WHERE 子句中的复杂条件)
  • 注意事项

在 PostgreSQL 中处理 NULL 值需要特别注意,因为 NULL 表示"未知"或"不存在"的值,与普通值的行为不同。以下是几种处理 NULL 值的 SQL 条件写法:

1. 检查是否为 NULL

sql 复制代码
-- 使用 IS NULL 检查 NULL 值
SELECT * FROM table_name WHERE column_name IS NULL;

-- 使用 IS NOT NULL 检查非 NULL 值
SELECT * FROM table_name WHERE column_name IS NOT NULL;

2. NULL 值与比较运算符

sql 复制代码
-- 以下写法不会返回任何行,因为 NULL 不能与任何值比较
SELECT * FROM table_name WHERE column_name = NULL;  -- 错误写法
SELECT * FROM table_name WHERE column_name != NULL; -- 错误写法

-- 正确写法是使用 IS NULL 或 IS NOT NULL

3. 在聚合函数中处理 NULL

sql 复制代码
-- COUNT 会忽略 NULL 值
SELECT COUNT(column_name) FROM table_name;  -- 只计算非 NULL 值
SELECT COUNT(*) FROM table_name;            -- 计算所有行,包括 NULL 值

-- 其他聚合函数如 SUM, AVG 也会忽略 NULL 值

4. 在 WHERE 子句中的复杂条件

sql 复制代码
-- 查找值为 NULL 或满足特定条件的行
SELECT * FROM table_name 
WHERE column_name IS NULL OR column_name = 'some_value';

-- 查找值不为 NULL 且满足特定条件的行
SELECT * FROM table_name 
WHERE column_name IS NOT NULL AND column_name LIKE 'A%';

注意事项

  • NULL 不等于空字符串 '',也不等于 0
  • 任何与 NULL 的算术运算结果都是 NULL
  • 在 UNIQUE 约束中,NULL 值被视为彼此不同(允许多个 NULL 值)
  • 在 ORDER BY 中,NULL 值默认排在最后(可使用 NULLS FIRST/NULLS LAST 调整)