当前位置: 首页 > 工具软件 > JSONb > 使用案例 >

postgresql jsonb 查询

汝和裕
2023-12-01
  1. jsonb 存储数组类型
    存储时元素需转化为字符串
    ids :jsonb [“1”, “2”,“3”]
where ids ?| ARRAY ['1']
  1. jsonb 存储对象类型内包含数组类型
    存储的数组内的元素需要转化成字符串
    ids :jsonb {“userIds”:[“1”,“2”,“3”] }
# 查询是要将元素取出转化为jsonb数组类型进行查询
where (ids->> 'userIds')::jsonb ?| ARRAY ['1']
  1. jsonb 存储复杂类型(数组与对象嵌套)
    想要查询jsonb内 包含"h": "66666666666"数据
    存储格式:
    字段名:items :: jsonb
{
    "a": [{
        "b": "ccccc",
        "d": [{
            "e": "eeeee",
            "f": {
                "g": "ggggggggggg",
                "h": "HHHHHHHHHHHHHH"
            }
        }, {
            "e": "fffffffff",
            "f": {
                "g": "rrrrrrrrrr",
                "h": "66666666666" # 想要查询到的字段
            }
        }]
    }, {
        "b": "ccccc",
        "d": [{
            "e": "eeeee",
            "f": {
                "g": "TTTTTTTTT",
                "h": "UUUUUUU"
            }
        }, {
            "e": "QQQQQQQQ",
            "f": {
                "g": "WWWWWWWWW",
                "h": "4444444444"
            }
        }]
    }]
}
  1.  获取items 中的 a 数组对象:
     items ->> 'a' 
     得到结果为一行的jsonb 的数组格式
    
  2.  jsonb 数组格式需要使用函数json_array_elements()处理为单独的jsonb 对象,使用时需要将jsonb 数组格式转化为jsonb
     jsonb_array_elements((items ->> 'a')::jsonb)
     得到结果为两行的a数组中对象
    
  3.  获取a数组对象中的d数组对象:
     jsonb_array_elements((items ->> 'a')::jsonb)->>"d"
     得到结果为d的jsonb的数组格式,由于第二步中a中的数组分为两行
     所以会有两行的d的jsonb的数组格式
    
  4.  第三步中的结果为数组格式,则如同第二步操作一样,转换为jsonb 格式后拆分数组转化为多行对象
      jsonb_array_elements(jsonb_array_elements((items ->> 'a')::jsonb)->>"d"::jsonb)
     得到的结果为四行的d中的对象
    
  5.  获取d对象中的f对象
     jsonb_array_elements(jsonb_array_elements((items ->> 'a')::jsonb)->>"d"::jsonb)->>"f"
     得到的结果为四行的f对象
    
  6.  在获取了单层的对象后就可以结合jsonb的查询操作进行对数据的筛选
     想要查询items中包含"h": "66666666666"数据 
     先通过子查询 将 items字段转化为多行的f对象 
     然后就可以直接查询f中包含"h": "66666666666"数据即可
    
    where f::jsonb @> '{\"h\":\"66666666666\"}' :: jsonb
    
 类似资料: