json - Postgres 10,从包含json对象数组的json对象中选择
问题描述
在数据库中,我的文本字段包含具有以下结构的 json:
"Limits":{
"fields":[
{
"key":"DAILY_LIMIT",
"value":"1559",
"lastModified":1543857829148,
},
{
"key":"MONTHLY_LIMIT",
"value":"25590",
"lastModified":1543857829148,
}
]
}
我需要检查 daily_limit 是否存在。使用 LIKE %DAILY_LIMIT% 很容易做到,但性能不是很好,而且我也无法获得价值(现在我不需要它,但也许将来会需要它)。有一个选项可以在不杀死数据库的情况下检查此密钥是否存在?我尝试使用 'Limits'->'fields'-> 但我不知道下一步应该是什么......而且必须通过查询来完成,我无法将对象传递给后端然后检查它
解决方案
如果您想以 JSON 方式执行此操作,这可能是一个解决方案:
WITH data AS (
SELECT 'somedata' as somedata, '{"Limits":{"fields":[{"key":"DAILY_LIMITS","value":"1559","lastModified":1543857829148},{"key":"MONTHLY_LIMIT","value":"25590","lastModified":1543857829148}]}}'::jsonb as data
)
SELECT
d.*
FROM data d, jsonb_array_elements(data -> 'Limits' -> 'fields')
WHERE value ->> 'key' = 'DAILY_LIMITS'
jsonb_array_elements
将数组扩展为每个元素一行。在下一步中,您可以检查key
的值。
但是演示表明,LIKE
正如@404 正确提到的那样,一个简单的方法会快得多(看看这两个例子的成本。)
推荐阅读
- xml - XSL - 用不同的值替换相同名称节点的值
- java - .putAll() 会影响复制的变量吗?
- javascript - 从数组中删除值为 0 的对象
- javascript - d3/javascript 根据输入过滤数据
- javascript - Node.js puppeteer - 如何从表中仅获取某些(过滤器)记录
- powershell - 通过文件夹路径为组中的用户获取有效访问权限
- django - /admin/auth/user/ 处的类型错误
- uima - 在 UIMA RUTA / RETAINTYPE 中构建 WordTables 的问题不起作用
- python - 字符串操作:如何隔离字典中的单词
- json - JSON 响应中的相同属性可以是数字/布尔值/字符串吗?