Postgres 10,来自 json 对象的 select 包含 json 对象数组

Postgres 10, select from json object containing json array of objects

在数据库中,我的文本字段包含 json,结构为:

"Limits":{
  "fields":[
    {
      "key":"DAILY_LIMIT",
       "value":"1559",
       "lastModified":1543857829148,
    },
    {
      "key":"MONTHLY_LIMIT",
      "value":"25590",
      "lastModified":1543857829148,
    }
  ]
}

我需要检查 daily_limit 是否存在。使用 LIKE %DAILY_LIMIT% 很容易,但性能不是很好,而且我也无法获得价值(现在我不需要它,但也许将来会需要它)。有一个选项可以在不杀死数据库的情况下检查这个密钥是否存在?我试过 'Limits'->'fields'-> 但我不知道下一步应该是什么......而且它必须通过查询完成,我无法将对象传递给后端然后检查它

demo: db<>fiddle

如果您想按照 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 正确提到的要快得多(查看两个示例的成本。)