检查postgresql jsonb列中是否存在密钥

时间:2018-02-15 16:37:32

标签: sql postgresql jsonb

我在postgres db中有一个jsonb列。我需要查询存储在列中的json中是否存在特定键“ssn”。此键不是顶级键,而是嵌套的。我写了一个类似于下面的查询,但似乎没有找到合适的列 -

select * from application where content ? 'ssn';

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

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

3 个答案:

答案 0 :(得分:1)

如果你知道ssn键的所有可能位置,你可以使用查询:

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

答案 1 :(得分:1)

使用extract-element-at-path运算符#>>并检查给定路径的值是否为null。

示例:

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

答案 2 :(得分:0)

  1. 要么必须编写递归查询来解析json的结构并检查每个分支中的密钥,
  2. 或简单地将模式与jsonb的文本表示匹配
  3. 像往常一样:

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