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

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;

关键调整点解释

  1. 用jsonb_each替代jsonb_object_keys:
    原来的jsonb_object_keys只能拿到键名,而jsonb_each会返回键值对的行集合,这样我们能同时获取到other键对应的内容。

  2. CASE分支处理特殊键:
    通过条件判断,当遍历到的键是other时,我们用它的value作为统计项;其他键则保留原键名,完美契合你的需求。

  3. 保留原有统计逻辑:
    继续使用COUNT(DISTINCT (t._doc::jsonb -> 'bar')::text)来统计不同bar值下的出现次数,和你原查询的统计逻辑保持一致。

示例数据验证

针对你给出的示例_doc = { "answers": { "baz": true, "qux": true, "other": "How do i find this" } },执行该查询后会得到:

itemoccurrence_count
baz1
qux1
How do i find this1

完全符合你的期望结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:52:08