【问题标题】:checking for an existence of a key in postgresql jsonb column检查 postgresql jsonb 列中是否存在键
【发布时间】:2018-07-26 11:56:55
【问题描述】:

我在 postgres 数据库中有一个 jsonb 列。我需要查询存储在列中的 json 中是否存在特定键“ssn”。该键不是顶级键,而是嵌套的。我写了一个类似于下面的查询,但它似乎没有检索到适当的列-

select * from application where content ? 'ssn';

当我使用顶级键运行上述查询时,它可以工作。

{  
   "name":"bob",
   "business":{  
      "ssn":"XXXXXXXX",
    }
}

【问题讨论】:

  • 您能否提供一个此查询未检索到的 json 样本?
  • @IvanMogila 添加了一个示例。实际有效载荷要大得多

标签: sql postgresql jsonb


【解决方案1】:

如果您知道 ssn 密钥的所有可能位置,则可以使用查询:

select *
from application
where content #> '{business,ssn}' is not null
  or content #> '{whatever,deep,ssn}' is not null;

【讨论】:

  • 谢谢@Ivan。我刚刚在 Haleemur 的回答下添加了其他问题。
【解决方案2】:

使用路径提取元素运算符#>> 并检查给定路径的值是否为空。

示例:

WITH test(col) AS (
SELECT UNNEST(
  ARRAY['{"name": "bob", "business": {"ssn": "abcd"}}'::jsonb, 
        '{"name": "jen", "business": {"ssn": "1234"}}',   
        '{"name": "kay", "nonprofit": {"no-ssn": "no-ssn"}}'
        '{"name": "todd", "business": {"no-ssn": "no-ssn"}}']
))
SELECT * FROM test
WHERE col#>>'{business, ssn}' IS NOT NULL

【讨论】:

  • 感谢@Haleemjur Ali。这适用于示例,但不适用于业务元素是另一个根元素下的数组的场景。作为此查询的一部分,我如何处理数组?
  • 添加一个更好的例子,如果您需要帮助制定有效的解决方案。
【解决方案3】:

你

  1. 要么必须编写递归查询来解析 json 的结构并检查每个分支中的键,
  2. 或简单地将模式与 jsonb 的文本表示进行匹配

类似的东西:

select * from application 
where content::text like '%"ssn":%';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多