TLDR:如何找到包含 json 数字数组的每条记录,该数组包含给定数组/列表的一个数字。
好的,我尝试了很多,阅读了很多其他线程,但我还没有找到可行的解决方案。我想在 Postgres 中找到一些 JSON 对象。它们包含多项选择的索引。
对象:
[{"id": 5, "list": [1, 2, 3]}, {"id": 6, "list": [4, 5, 6]}]
我需要选择所有包含项目 1 或 5 的对象。现在,我只能检查一个值
SELECT '[1, 2, 3, 4]'::jsonb @> '3'::jsonb as result;
或者如果两者都存在:
SELECT '[1,2,3,4]'::jsonb @> '[1, 2]'::jsonb as result;
或者,有趣的是,如果我有一个字符串数组,我可以做我需要的:
SELECT '["1","2","3","4"]'::jsonb ?| array['1', '5'] as result;
如何将其应用于 JSON 数字数组?我尝试转换为 int[] 和许多其他东西。没有任何效果。我要么需要将数字数组转换为文本数组以使用它,要么为右侧找到正确的转换。这也不起作用:?|数组[1, 5]::文本[]
解决方案一:
好吧,我和 Mao Tsuns 想到的第一件事是使用 OR
,看起来仍然是最快和最简单的解决方案。
解决方案 2:
我终于找到了一种更短的方法(就像我认为它应该工作一样)但它是一个类型转换 hell (也是 9.4+)并且看起来不太漂亮:
SELECT array_to_json(translate('[1,2,3,4]'::jsonb::text, '[]', '{}')::text[])::jsonb ?| array['1','5'] 作为结果;
这基本上是将整数转换为字符串。
最佳答案
你可以使用OR
:
t=# SELECT '[1, 2, 3, 4]'::jsonb @> '3'::jsonb OR '[1, 2, 3, 4]'::jsonb @> '5'::jsonb as result;
result
--------
t
(1 row)
或者将未嵌套的jsonb数组聚合成int数组,比较是否相交:
t=# with c(j) as (values('[1, 2, 3, 4]'::jsonb))
, a as (select j,jsonb_array_elements(j) ja from c)
select array_agg(ja), j, array_agg(ja::text::int) && array[5,4] from a group by j;
array_agg | j | ?column?
-----------+--------------+----------
{1,2,3,4} | [1, 2, 3, 4] | t
(1 row)
because all jsonb operators behave as documented在你的例子中。而且我没有看到一些优雅的更短的解决方案......
关于sql - Postgres Json(b) int 数组包含任何数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321403/