You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询,仅返回A、B、C、D中两个及以上字段非空的结果?

筛选至少两个非空字段的SQL查询方案

通用跨数据库实现(标准SQL)

这是最稳妥的写法,兼容所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等):

SELECT *
FROM your_table
WHERE 
    (CASE WHEN A IS NOT NULL THEN 1 ELSE 0 END) +
    (CASE WHEN B IS NOT NULL THEN 1 ELSE 0 END) +
    (CASE WHEN C IS NOT NULL THEN 1 ELSE 0 END) +
    (CASE WHEN D IS NOT NULL THEN 1 ELSE 0 END) >= 2;

逻辑说明:通过CASE WHEN将每个字段的非空状态转换为1(非空)或0(空),求和后判断总和是否大于等于2,满足条件的记录即为至少两个字段非空的结果。

数据库特有的简化写法

MySQL/MariaDB

可以用IF函数替代CASE WHEN,让代码更简洁:

SELECT *
FROM your_table
WHERE 
    IF(A IS NOT NULL, 1, 0) +
    IF(B IS NOT NULL, 1, 0) +
    IF(C IS NOT NULL, 1, 0) +
    IF(D IS NOT NULL, 1, 0) >= 2;

PostgreSQL

利用数组操作简化统计逻辑:

SELECT *
FROM your_table
WHERE cardinality(array_remove(array[A,B,C,D], NULL)) >= 2;

逻辑说明:将字段打包成数组,移除所有NULL元素后,用cardinality函数获取数组长度,长度≥2即符合要求。

扩展:将空字符串视为“空值”的场景

如果业务中需要把''(空字符串)也当作空值处理,只需调整判断条件:

SELECT *
FROM your_table
WHERE 
    (CASE WHEN A IS NOT NULL AND A != '' THEN 1 ELSE 0 END) +
    (CASE WHEN B IS NOT NULL AND B != '' THEN 1 ELSE 0 END) +
    (CASE WHEN C IS NOT NULL AND C != '' THEN 1 ELSE 0 END) +
    (CASE WHEN D IS NOT NULL AND D != '' THEN 1 ELSE 0 END) >= 2;

内容的提问来源于stack exchange,提问作者Basheer Raad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:55:45