web-dev-qa-db-ja.com

PostgreSQLは、配列要素の順序を持​​つ配列型でJOINし、どのように実装しますか?

データベースに2つのテーブルがあります。

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}

ここで、テーブルsome_chosen_data_in_orderから選択した行の配列itemsから配列型の要素の順序でデータを取得したいと思います。

私の試みは参加しました:

SELECT I.* FROM items AS I 
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?

2番目の試みは次のようなサブクエリでした。

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

ただし、配列フィールドと同じ順序でIDを保持するものはありません。特定の行のsome_chosen_data_in_orderテーブルの配列IDの順序に対応するitemsテーブルからデータを取得する方法を教えてください。

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

上記のクエリは、IDが1,2,3,2,3,5の順序でitemsテーブルからアイテムを選択します。

62
Marcin Kapusta

おそらくあなたのテーブルを正規化することは、私があなたに与えることができる最高のアドバイスでしょう。

Int_array contribモジュールには、配列内のintのインデックス位置を提供するidx関数があります。また、 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)
24
Scott Bailey
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
aruis
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 = ?])
0
Roy Merrill