PostgreSQL中如何新建列统计varchar列单元格内多值数量?
在PostgreSQL中统计字符串分隔值数量并新增列
场景1:临时查询统计结果(不修改表结构)
如果只是需要临时查看统计数据,无需改动原表结构,可直接执行以下SQL:
- 统计分隔后的元素总数(不去重):
SELECT vehicle_column, array_length(string_to_array(vehicle_column, '/'), 1) AS "count of vehicle" FROM your_table;
- 统计分隔后的不同值数量(去重):
SELECT vehicle_column, (SELECT COUNT(DISTINCT elem) FROM unnest(string_to_array(vehicle_column, '/')) AS elem) AS "count of vehicle" FROM your_table;
处理空值/空字符串
若存在单元格为空或仅含分隔符的情况,可通过coalesce和nullif处理,返回0而非null:
SELECT vehicle_column, coalesce(array_length(string_to_array(nullif(vehicle_column, ''), '/'), 1), 0) AS "count of vehicle" FROM your_table;
场景2:新增永久列并填充统计值
如果需要将统计结果永久存入新列,分两步操作:
- 添加新列
ALTER TABLE your_table ADD COLUMN "count of vehicle" INTEGER;
- 填充统计值
- 无需去重时:
UPDATE your_table SET "count of vehicle" = coalesce(array_length(string_to_array(nullif(vehicle_column, ''), '/'), 1), 0);
- 需要去重统计时:
UPDATE your_table SET "count of vehicle" = ( SELECT COUNT(DISTINCT elem) FROM unnest(string_to_array(nullif(vehicle_column, ''), '/')) AS elem );
注意事项
- 替换
your_table为实际表名,vehicle_column为目标字符串列名 - 若分隔符不是
/,直接替换为实际分隔符即可 - 大表执行
UPDATE前建议先备份,或分批更新避免长时间锁表
内容的提问来源于stack exchange,提问作者Joshua Smart-Olufemi
相关产品推荐
相关产品推荐

