从 JSON 对象中提取所有键,除非某个键有值
Extracting all keys from a JSON object unless a certain key has a value
我的 Postgres jsonb-foo 不是很好,但我很感激对我试图组合的查询的一些帮助。
我有这个基本查询来提取 _doc
的 'answers' 键中所有键的名称。 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)
如果可能的话,我希望得到一些帮助来构建此查询。
谢谢
- demo:db<>fiddle 几个 json 记录
- demo:db<>fiddle 一条 json 条记录两次具有相同的密钥(严格不推荐!)
使用json_each_text()
函数得到key/value对。之后获取 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
我的 Postgres jsonb-foo 不是很好,但我很感激对我试图组合的查询的一些帮助。
我有这个基本查询来提取 _doc
的 'answers' 键中所有键的名称。 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)
如果可能的话,我希望得到一些帮助来构建此查询。
谢谢
- demo:db<>fiddle 几个 json 记录
- demo:db<>fiddle 一条 json 条记录两次具有相同的密钥(严格不推荐!)
使用json_each_text()
函数得到key/value对。之后获取 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