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

时间:2010-03-21 10:36:31

标签: sql arrays postgresql join

我在数据库中有两个表:

CREATE TABLE items(
 id SERIAL PRIMARY KEY,
 ... some other fields
);

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

CREATE TABLE some_chosen_data_in_order(
 id SERIAL PRIMARY KEY,
 id_items INTEGER[],
);

此表包含数组类型字段。每行包含特定顺序的表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 = ?

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

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表中获取数据,并从some_chosen_data_in_order表中获取特定行的数组ID顺序?

5 个答案:

答案 0 :(得分:58)

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

以上查询从items表中选择带有ID的项目:1,2,3,2,3,5按此顺序。

答案 1 :(得分:24)

将桌子正常化可能是我能给你的最佳建议。

int_array contrib模块有一个idx函数,它将为你提供数组中int的索引位置。此外,snippets wiki上还有一个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)

答案 2 :(得分:2)

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)

enter image description here

答案 3 :(得分:0)

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 = ?])

答案 4 :(得分:0)

如果您不喜欢函数 (https://stackoverflow.com/a/2489805/642096):

SELECT jt.*
FROM (
     SELECT ARRAY_AGG(DISTINCT dupes_column) AS unique_vals
     FROM dupes_table
) q
LEFT JOIN joined_table jt
ON jt.id = ANY(q.unique_vals);