PostgreSQL jsonb查询求助:按规则统计answers键值出现次数
调整PostgreSQL JSONB查询:针对特定键统计值而非键名
这事儿好办,咱们来修改查询逻辑,实现你要的效果——对大部分键统计键名的出现次数,唯独对other键统计其对应值的出现次数。
修改后的查询语句
SELECT -- 核心逻辑:判断键名,特殊处理'other'键 CASE WHEN kv.key = 'other' THEN kv.value::text ELSE kv.key END AS item, -- 保留你原有的去重统计bar的逻辑 COUNT(DISTINCT (t._doc::jsonb -> 'bar')::text) AS occurrence_count FROM public."table_name" t, -- 用jsonb_each展开answers下的所有键值对(替代原有的jsonb_object_keys) jsonb_each(t._doc::jsonb -> 'answers') kv WHERE -- 过滤掉answers为空或不存在的记录 t._doc::jsonb -> 'answers' IS NOT NULL -- 确保统计项不为空(对应原查询的ss.foo IS NOT NULL) AND CASE WHEN kv.key = 'other' THEN kv.value::text ELSE kv.key END IS NOT NULL GROUP BY item;
关键调整点解释
用
jsonb_each替代jsonb_object_keys:
原来的jsonb_object_keys只能拿到键名,而jsonb_each会返回键值对的行集合,这样我们能同时获取到other键对应的内容。CASE分支处理特殊键:
通过条件判断,当遍历到的键是other时,我们用它的value作为统计项;其他键则保留原键名,完美契合你的需求。保留原有统计逻辑:
继续使用COUNT(DISTINCT (t._doc::jsonb -> 'bar')::text)来统计不同bar值下的出现次数,和你原查询的统计逻辑保持一致。
示例数据验证
针对你给出的示例_doc = { "answers": { "baz": true, "qux": true, "other": "How do i find this" } },执行该查询后会得到:
| item | occurrence_count |
|---|---|
| baz | 1 |
| qux | 1 |
| How do i find this | 1 |
完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者DWB
相关产品推荐
相关产品推荐

