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

如何用SQL统计单条记录中字段的非空值数量?

统计单条记录非空字段数量的SQL方法

要统计单条记录中字段的非空值数量,核心思路是对每个字段判断是否非空,非空则计1,否则计0,最后将所有字段的计数值相加。以下是不同场景下的实现方式:

通用SQL写法(兼容所有数据库)

使用CASE表达式实现,这是所有SQL数据库都支持的标准写法:

SELECT 
  id,
  name,
  age,
  hobby,
  sports,
  (
    CASE WHEN id IS NOT NULL THEN 1 ELSE 0 END +
    CASE WHEN name IS NOT NULL THEN 1 ELSE 0 END +
    CASE WHEN age IS NOT NULL THEN 1 ELSE 0 END +
    CASE WHEN hobby IS NOT NULL THEN 1 ELSE 0 END +
    CASE WHEN sports IS NOT NULL THEN 1 ELSE 0 END
  ) AS non_null_count
FROM User
WHERE id = 1;

执行这条语句后,会返回目标记录的所有字段,以及non_null_count字段,值为3,符合需求。

各数据库简化写法

不同数据库提供了简化的判断函数,可以让代码更简洁:

MySQL/MariaDB

使用IF函数:

SELECT 
  id,
  name,
  age,
  hobby,
  sports,
  (
    IF(id IS NOT NULL, 1, 0) +
    IF(name IS NOT NULL, 1, 0) +
    IF(age IS NOT NULL, 1, 0) +
    IF(hobby IS NOT NULL, 1, 0) +
    IF(sports IS NOT NULL, 1, 0)
  ) AS non_null_count
FROM User
WHERE id = 1;

Oracle

使用NVL2函数(若字段非空返回第一个值,否则返回第二个):

SELECT 
  id,
  name,
  age,
  hobby,
  sports,
  (
    NVL2(id, 1, 0) +
    NVL2(name, 1, 0) +
    NVL2(age, 1, 0) +
    NVL2(hobby, 1, 0) +
    NVL2(sports, 1, 0)
  ) AS non_null_count
FROM User
WHERE id = 1;

SQL Server

使用IIF函数:

SELECT 
  id,
  name,
  age,
  hobby,
  sports,
  (
    IIF(id IS NOT NULL, 1, 0) +
    IIF(name IS NOT NULL, 1, 0) +
    IIF(age IS NOT NULL, 1, 0) +
    IIF(hobby IS NOT NULL, 1, 0) +
    IIF(sports IS NOT NULL, 1, 0)
  ) AS non_null_count
FROM User
WHERE id = 1;

扩展:统计所有记录的非空字段数

如果需要统计表中所有记录的非空字段数量,只需去掉WHERE id = 1条件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:50:24