PostgreSQL连接与数组类型与数组元素顺序,如何实现?

PostgreSQL连接与数组类型与数组元素顺序,如何实现?,sql,arrays,postgresql,join,Sql,Arrays,Postgresql,Join,我在数据库中有两个表: CREATE TABLE items( id SERIAL PRIMARY KEY, ... some other fields ); 此表包含具有唯一ID的CAME数据行 CREATE TABLE some_chosen_data_in_order( id SERIAL PRIMARY KEY, id_items INTEGER[], ); 此表包含数组类型字段。每行包含表项中按特定顺序排列的ID值。例如:{2,4233,5} 现在,我想从表中的选定行的表项

我在数据库中有两个表:

CREATE TABLE items(
 id SERIAL PRIMARY KEY,
 ... some other fields
);
此表包含具有唯一ID的CAME数据行

CREATE TABLE some_chosen_data_in_order(
 id SERIAL PRIMARY KEY,
 id_items INTEGER[],
);
此表包含数组类型字段。每行包含表项中按特定顺序排列的ID值。例如:{2,4233,5}

现在,我想从表中的选定行的表项中获取数据,这些数据按数组类型中元素的顺序排列

我的尝试是加入:

SELECT I.* FROM items AS I 
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?
第二次尝试类似于子查询:

SELECT I.* FROM items AS I 
WHERE I.id = ANY 
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order  WHERE id = ?])

但它们都没有像在数组字段中那样保持ID的顺序。您能否帮助我,如何从items表中获取数据,并与特定行的order表中的某些选定数据的数组id顺序相对应?

也许规范化您的表将是我能给您的最佳建议

int_数组contrib模块有一个idx函数,它将为您提供int在数组中的索引位置。上还有一个idx函数,可用于任何数据类型的数组

SELECT i.*, idx(id_items, i.id) AS idx
FROM some_chosen_data_in_order s
JOIN items i ON i.id = ANY(s.id_items)
ORDER BY idx(id_items, i.id)
上面的查询从items表中按顺序选择id为1,2,3,2,3,5的项

SELECT I.* FROM items AS I 
WHERE I.id IN (SELECT UNNEST(id_items) FROM some_chosen_data_in_order 
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order  WHERE id = ?])

这显然是我需要的。塔克斯!由于效率的原因,我正在对我的数据库进行非规范化。工作正常,谢谢。ORDERBY子句也只适用于idx。其中s.id=?-身份证号码是个很酷的把戏!我有一个客户的ID列表,需要加入他们的行列,但我想找到一种不带临时表的方法。您可以将selectunnestarray[1,2,3]作为idlist加入,它的工作方式就像champ。谢谢@你能给我看看这个问题吗?仍然无法获取它如果要将两个表相互连接,可以使用SELECT b.*,a.item\u id FROM SELECT unnestarray\u column\u in_table\u a item\u id FROM table\u a作为b.id=a.item\u id上的右连接表;我需要连接到表,但上面的注释对我不起作用,但这样做了:选择*FROM table_a join table_b ON b.id=ANYa.array_column_in_table_a;,由于这与问题不匹配,为什么选择它?在添加代码作为答案时,请在答案中添加一些解释,以供将来的读者阅读。。
SELECT I.* FROM items AS I 
WHERE I.id IN (SELECT UNNEST(id_items) FROM some_chosen_data_in_order 
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order  WHERE id = ?])
select distinct on (some_chosen_data_in_order.id)
  some_chosen_data_in_order.*,
   array_to_json( array_agg(row_to_json( items))
  over ( partition by some_chosen_data_in_order.id ))
from some_chosen_data_in_order
  left join items on items.id = any (some_chosen_data_in_order.id_items)