PostgreSQL:能否将子查询结果动态用于jsonb查询?
解决方案:动态统计JSONB字段为空的记录数
当然可以实现,针对PostgreSQL的场景,提供两种高效的动态处理方案:
方案一:关联查询(无需动态SQL,推荐)
直接通过表关联+JSONB操作一次性统计所有类型的结果,无需循环执行多个查询:
SELECT t1.type_of_client, COUNT(*) AS null_count FROM table1 t1 LEFT JOIN table2 t2 ON t2.fields ->> t1.type_of_client IS NOT NULL GROUP BY t1.type_of_client ORDER BY t1.type_of_client;
逻辑说明
- 用
LEFT JOIN关联两张表,仅匹配table2中对应JSONB字段不为空的记录 - 分组后
COUNT(*)统计的是table2中对应字段为空的记录数(未被匹配的table2记录会被计入) - 自动适配
table1中所有type_of_client,无需手动修改查询
方案二:动态生成查询语句(适合批量执行单查询)
如果需要生成独立的查询语句或批量执行统计,可以用format函数生成SQL脚本:
1. 生成查询语句
SELECT format('select count(*) as %I_count from table2 where fields->>''%s'' is null;', type_of_client, type_of_client) AS query FROM table1;
执行后会得到每条类型对应的统计SQL,直接复制执行即可。
2. 批量执行并存储结果
先创建临时表存储结果:
CREATE TEMP TABLE temp_results (client_type text, null_count integer);
然后用DO块循环执行统计并插入结果:
DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT type_of_client FROM table1 LOOP EXECUTE format(' INSERT INTO temp_results (client_type, null_count) SELECT ''%s''::text, count(*) FROM table2 WHERE fields->>''%s'' IS NULL; ', rec.type_of_client, rec.type_of_client); END LOOP; END $$;
最后查询临时表获取所有结果:
SELECT * FROM temp_results;
内容的提问来源于stack exchange,提问作者ltx
相关产品推荐
相关产品推荐

