Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Postgresql中jsonb字段内的数组中提取元素_Sql_Postgresql - Fatal编程技术网

从Postgresql中jsonb字段内的数组中提取元素

从Postgresql中jsonb字段内的数组中提取元素,sql,postgresql,Sql,Postgresql,在我的Postgresql表中,有一个名为data的jsonb字段,其中包含以下格式的数据: { list:[1,2,3,4,5] } 我使用以下查询: select data->'list' from "Table" where id=1 这给了我数组[1,2,3,4,5] 问题是我想在in子句中的另一个select查询中使用此结果。它不接受数组 IN([1,2,3,4,5])失败 它希望: IN(1,2,3,4,5) 因此,在我最初的查询中,我不知道如何将[1,2,3,4,5]转

在我的Postgresql表中,有一个名为
data
的jsonb字段,其中包含以下格式的数据:

{
 list:[1,2,3,4,5]
}
我使用以下查询:

select data->'list' from "Table" where id=1
这给了我数组
[1,2,3,4,5]

问题是我想在in子句中的另一个select查询中使用此结果。它不接受数组

IN([1,2,3,4,5])
失败

它希望:

IN(1,2,3,4,5)

因此,在我最初的查询中,我不知道如何将[1,2,3,4,5]转换为1,2,3,4,5

我目前的查询是:

select * from "Table2" where "items" in (select data->'list' from "Table" where id=1)

请提供帮助

如果将搜索值强制转换为
jsonb
,则可以在中使用数组包含运算符(),而不是
。例如:

SELECT *
FROM "Table2"
WHERE items::jsonb <@ (SELECT data->'list' FROM "Table" WHERE id=1)

使用
jsonb\u array\u elements()
将元素转换为行

select t2.*
from table_2 t2
where t2.items in (select jsonb_array_elements_text(t1.data -> 'list')::int
                   from table_1 t1 
                   where t1.id = 1);

这假设
items
定义为
text
varchar
,并包含一个值-但是名称(复数!)似乎表示另一个非规范化列

我不明白你到底需要如何使用列表中的值。请回答您的问题,并在尝试访问数组元素的位置添加完整的查询。我更新了问题并添加了实际查询。我认为这很接近,但仍然出现错误。我创建了这个演示@asanas:好吧,你是在比较一个整数和一个文本值。您需要强制转换数组的结果。看我的edit@asanas与您的问题无关,但是:您应该真正避免那些可怕的引用标识符。他们的麻烦远比他们值得的多。这个查询成功了。谢谢!。是的,他们很痛苦。我会避开他们。
select t2.*
from table_2 t2
where t2.items in (select jsonb_array_elements_text(t1.data -> 'list')::int
                   from table_1 t1 
                   where t1.id = 1);