在PostgresQL中查询JSONB字段数组

斯蒂芬·德斯诺(Stephane Desnault)

我在弄清楚如何查询PostgreSQL JsonB数据类型时遇到麻烦。我有一个结构简单的表:

CREATE TABLE myTable (id BIGINT PRIMARY KEY, answers JSONB)

“答案”列中的所有Json文档均采用以下格式:

[
{"R" : "aaa", "V" : 25},
{"R" : "aaa", "V" : 31}, 
{"R" : "bbb", "V" : 38}
...
]

列表中可以有很多元素,但是所有元素都有一个“ R”和“ V”项。

我想使用SQL检索表,列出ID,以及所有“ V”的Json列表,其中“ R” ==“ aaa”。

对于上面的示例,我将得到:

  • 备案编号
  • [25,31]-两个“ V”值,其中“ R” ==“ aaa”

有什么想法吗?感谢您的帮助,我花了一些时间在Web上找到JSon路径示例,但没有找到类似的东西。

提前致谢。

马思

注意:仅适用于Postgresql 12+

使用jsonpath:

WITH data(id, json_arr) AS (
    VALUES (1, $$[
      { "R": "aaa", "V": 25 },
      { "R": "aaa", "V": 31 },
      { "R": "bbb", "V": 38 }
    ]$$::JSONB)
)
SELECT id,
       -- $[*]             : "inside the top level array"
       -- ? (@.R == "aaa") : "keep only when the "R" key's value is "aaa""
       -- .V               : "select the "V" key of those elements"
       jsonb_path_query_array(json_arr, '$[*] ? (@.R == "aaa").V')
FROM data

返回:

+--+----------------------+
|id|jsonb_path_query_array|
+--+----------------------+
|1 |[25, 31]              |
+--+----------------------+

注意:您也可以使用

jsonb_path_query_array(
    json_arr,
    '$[*] ? (@.R == $r_value).V',
    '{"r_value": "aaa"}'  -- pass the 'r_value' to the query above
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章