postgresql - 从 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)
如果可能的话,我希望得到一些帮助来构建这个查询。
谢谢
解决方案
- demo:db<>fiddle几个 json 记录
- demo:db<>fiddle用于两次具有相同密钥的 json 记录(严格不推荐!)
使用该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
推荐阅读
- swift - 当我尝试使用交互模式关闭键盘时,我的 inputAccessoryView 出现错误
- sql - 带参数和不带参数的查询 -> 完全不同的执行时间
- python - 如何在 Python 中清理 url 字符串?
- android - 网络请求失败
- angular - Angular Material 拖放到表格中
- mongodb - 从 Mongo DB 嵌套数组中获取不同的值并输出到单个数组
- kubernetes - Helm install 命令 vs kubectl 命令在 Kubernetes 集群部署中的作用
- excel - 通过唯一索引查找列之间最接近的匹配
- java - Spring Boot Maven 在多模块项目中使用不同版本的相同 jar
- python - 使用文件的时间戳在目录中查找文件