我一直在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'
不确定如何继续进行。
答案 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
转换为数组。