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

sta*_*ode 2 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"}]
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,我实现了通过-jsonb_array_elements(链接) - >>'ids'将链接数组与链接分开

不知道如何进一步.

And*_*mar 7

您可以使用jsonb_array_elements将json数组转换为行集.您可以将此值用于"ids"的值.使用@>操作,您可以检查,如果数组包含一个值:

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

一个棘手的部分是"[82293,82292]"存储为字符串,而不是数组.该ele->>'ids'表达式检索"[82293,82292]"作为使用字符串->>操作员(双>使它返回文本代替jsonb.)字符串的内容被转换成由阵列::jsonb.

rextester.com上的示例.