Postgres JSON数组包含给定的数组元素

时间:2017-03-08 20:33:26

标签: postgresql jsonb

我一直在stackoverflow上搜索这个答案,但没有找到任何有用的东西。 我在my_tbl中有数据:

folder_id |  links                                                                                                     
--------------+----------------------------------------------------------------
   761 | [{"ids": "[82293,82292]", "index": "index_1"}, {"ids": "[82293,82292]", "index": "index_2"}]
   769 | [{"ids": "[82323,82324]", "index": "index_3"}]
   572 | [{"ids": "[80031,79674,78971]", "index": "index_4"}]
   785 | [{"ids": "[82367,82369]", "index": "index_5"}, {"ids": "[82368,82371]", "index": "index_6"}]
   768 | [{"ids": "[82292,82306]", "index": "index_7"}]

我希望得到所有的行 - >>>' ids'包含82292.所以在这种情况下,它应该返回我folder_id 761和768。

到目前为止我实现的是将-id数组与链接分开 - jsonb_array_elements(链接) - >> ' IDS'

不确定如何继续进行。

1 个答案:

答案 0 :(得分:7)

您可以使用jsonb_array_elements将json数组转换为行集。您可以将此值用于“ids”的值。使用the @> operator,您可以检查数组是否包含值:

select  distinct folder_id
from    YourTable
cross join lateral
        jsonb_array_elements(links) ids(ele)      
where   (ele->>'ids')::jsonb @> '[82292]'

一个棘手的部分是"[82293,82292]"存储为字符串,而不是数组。 ele->>'ids'表达式使用"[82293,82292]"运算符将->>检索为字符串(双>使其返回文本而不是jsonb。)字符串的内容为由::jsonb转换为数组。

Example at rextester.com.