下面是一段Clickhouse SQL代码,用于统计指定数据库中多张表的字段空值情况。代码通过动态生成查询语句实现自动化统计,处理逻辑如下:
- 从系统表获取指定数据库(替换
your_database
)中所有表的字段元数据 - 根据字段类型动态生成对应的空值统计逻辑
- 使用
sum
聚合函数统计空值记录数 - 计算空值占比百分比
- 结果包含数据库名、表名、字段名、字段类型、空值计数、总行数和空值占比
SELECT
database,
table,
column,
type,
count_empty,
total_rows,
ROUND(count_empty * 100.0 / total_rows, 2) AS percentage
FROM (
SELECT
database,
table,
column,
type,
CASE
WHEN type LIKE 'String%' THEN
(SELECT sum(TRIM(IFNULL({col}, '')) = '') FROM {db}.{tbl})
WHEN type IN ('UInt8','UInt16','UInt32','UInt64','Int8','Int16','Int32','Int64','Float32','Float64') THEN
(SELECT sum(IFNULL({col}, 0) = 0) FROM {db}.{tbl})
ELSE
(SELECT sum({col} IS NULL) FROM {db}.{tbl})
END AS count_empty,
(SELECT count() FROM {db}.{tbl}) AS total_rows
FROM system.columns
WHERE database = 'your_database'
AND table IN ('table1', 'table2', 'table3') -- 替换为需要分析的表名
SETTINGS
allow_experimental_analyzer = 1,
format_template = 'SELECT \'{database}\', \'{table}\', \'{column}\', \'{type}\', ${{col:Identifier}}, ${{tbl:Identifier}}, ${{db:String}}'
)
使用说明:
- 替换数据库名:将代码中的
'your_database'
改为实际数据库名 - 指定表名:修改
table IN
列表中的表名(如'table1', 'table2'
) - 执行结果:查询将输出7列统计结果
处理逻辑说明:
字段类型 | 处理方式 | 空值定义 |
---|---|---|
String | TRIM(IFNULL(字段, '')) = '' |
空字符串 |
数值类型 | IFNULL(字段, 0) = 0 |
数值0 |
其他类型 | 字段 IS NULL |
NULL值 |
输出列说明:
列名 | 说明 |
---|---|
database | 数据库名称 |
table | 表名称 |
column | 字段名称 |
type | 字段类型 |
count_empty | 空值记录数(空串/0/NULL) |
total_rows | 表总行数 |
percentage | 空值占比百分比(保留两位小数) |
注意:对于数值类型字段,真实值为0的记录也会被统计在内。若需区分真实0值和空值,需要额外的业务逻辑处理。