SQL如何查询排除除主键外其余列全为NULL的行?
解决方案
针对你需要排除「除主键外所有列均为NULL」的行、且不想逐个列明判断的需求,提供两种通用实现方案:
方案1:动态生成查询条件(一次生成可长期复用,兼容所有SQL数据库)
你可以通过查询系统表自动拼接出所有非主键列的IS NULL判断条件,不用手动写72个列名。以MySQL为例,执行以下语句就能生成你需要的WHERE条件:
SELECT GROUP_CONCAT(COLUMN_NAME, ' IS NULL' SEPARATOR ' AND ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的库名' AND TABLE_NAME = 'emp_details' AND COLUMN_NAME != 'empno'; -- 此处替换为你的实际主键列名
执行后会直接输出完整的非主键列空值判断串,复制到你的查询语句中替换对应条件部分即可直接使用。PostgreSQL、SQL Server等其他数据库也有对应系统表可以实现相同的动态拼接逻辑,原理一致。
方案2:JSON序列化判断(无需写任何列名,兼容MySQL 5.7+/PostgreSQL 9.2+/SQL Server 2016+等支持JSON的数据库)
利用JSON序列化自动识别NULL值的特性,直接判断排除所有非主键列为空的行,完全不用手动罗列字段:
MySQL 写法:
SELECT * FROM emp_details WHERE JSON_LENGTH( JSON_REMOVE( JSON_OBJECT(*), -- 整行转JSON对象 '$.empno' -- 剔除主键字段 )->'$[*]?(@ != null)' ) > 0;
PostgreSQL 写法:
SELECT * FROM emp_details WHERE jsonb_strip_nulls(to_jsonb(emp_details) - 'empno') <> '{}'::jsonb;
该方案会自动适配所有非主键列,后续表结构新增、删除字段也不需要修改查询语句。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

