首页 > 解决方案 > 从 JSON 对象中提取所有键,除非某个键具有值

问题描述

我的 Postgres jsonb-foo 不是那么好,但我希望能对我正在尝试组合的查询提供一些帮助。

我有这个基本查询来提取_doc“答案”键中所有键的名称。jsonb 数据看起来像这样

_doc = {
    "answers": {
        "baz": true,
        "qux": true
        "other": "How do i find this"
    }
}

查询可能如下所示:

SELECT ss.foo, count(DISTINCT (ss.bar)) FROM (
      SELECT    (_doc::jsonb -> 'bar')::text as bar,
                jsonb_object_keys(_doc::jsonb -> 'answers' -> 'foo') as foo
      FROM public."table_name"
  ) ss
WHERE ss.foo IS NOT NULL
GROUP BY ss.foo;

所以这里的输出实际上是每个键answers出现的次数。

("baz" = 1, "qux" = 1, "other" = 1)

这是我的问题,我想获取每个键出现的次数,除了other. 在这种情况下,我想获取其内容出现的次数。所以我希望结果是

("baz" = 1, "qux" = 1, "How do i find this" = 1)

如果可能的话,我希望得到一些帮助来构建这个查询。

谢谢

标签: postgresqljsonbpostgresql-9.4

解决方案


使用该json_each_text()函数获取键/值对。之后获取 的键或值other,通过CASE子句进行选择

SELECT 
    CASE WHEN elems.key = 'other' THEN elems.value
        ELSE elems.key
    END AS key,
    COUNT(*)
FROM data,
    json_each_text(jsondata -> 'answers') AS elems
GROUP BY 1

推荐阅读