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

Adi*_*asz 33 sql arrays postgresql join

我在数据库中有两个表:

CREATE TABLE items(
 id SERIAL PRIMARY KEY,
 ... some other fields
);
Run Code Online (Sandbox Code Playgroud)

此表包含具有唯一ID的数据行.

CREATE TABLE some_chosen_data_in_order(
 id SERIAL PRIMARY KEY,
 id_items INTEGER[],
);
Run Code Online (Sandbox Code Playgroud)

);

该表包含数组类型字段.每行包含items特定顺序的表中ID的值.例如:{2,4,233,5}.

现在,我想从表中获取表items中所选行的数据,some_chosen_data_in_order以及数组类型中元素的顺序.

我的尝试是加入:

SELECT I.* FROM items AS I 
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?
Run Code Online (Sandbox Code Playgroud)

第二次尝试是子查询,如:

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

但是它们都没有以与数组字段相同的顺序保存ID.你能帮我吗,如何从items表中获取数据,并从some_chosen_data_in_order表格中获取特定行的数据ID顺序?

Mar*_*sta 66

SELECT t.*
FROM unnest(ARRAY[1,2,3,2,3,5]) item_id
LEFT JOIN items t on t.id=item_id
Run Code Online (Sandbox Code Playgroud)

上面的查询从items表中选择具有ID的项目:1,2,3,2,3,5.

  • 我需要加入表格,但上面的评论对我不起作用,但这确实适用:`SELECT * FROM table_a a JOIN table_b b ON b.id = ANY(a.array_column_in_table_a);`,感谢 https:/ /www.garysieling.com/blog/postgres-join-on-an-array-field (3认同)
  • unnest() 是一个非常酷的技巧!我有一个客户的 ID 列表,需要加入他们,但想找到一种无需临时表即可完成此操作的方法。您可以加入 (select unnest(ARRAY[1,2,3])) 作为 idlist,它的工作方式就像冠军一样。谢谢! (2认同)
  • 如果你想将两个表相互连接,你可以使用 `SELECT b.*, a.item_id FROM (SELECT unnest(array_column_in_table_a) item_id FROM table_a) 作为 RIGHT JOIN table_b b on b.id=a.item_id; ` (2认同)

Sco*_*ley 25

可能正常化你的表将是我能给你的最佳建议.

int_array 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)
Run Code Online (Sandbox Code Playgroud)


aru*_*uis 7

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明