it-swarm.com.de

PostgreSQL JOIN mit Array-Typ mit Array-Elementreihenfolge, wie implementieren?

Ich habe zwei Tabellen in der Datenbank:

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

Diese Tabelle enthält kommende Datenzeilen mit eindeutiger ID.

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

);

Diese Tabelle enthält Feldfeldtyp. Jede Zeile enthält Werte von IDs aus der Tabelle items in einer bestimmten Reihenfolge. Zum Beispiel: {2,4,233,5}.

Nun möchte ich Daten aus der Tabelle items für die ausgewählte Zeile aus der Tabelle some_chosen_data_in_order abrufen, wobei die Reihenfolge der Elemente im Array-Typ liegt.

Mein Versuch war JOIN:

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

Zweiter Versuch war eine Unterabfrage wie:

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

Aber keine von ihnen behält IDs in der gleichen Reihenfolge wie im Feld Array. Könnten Sie mir helfen, wie Sie Daten aus der items-Tabelle mit der Reihenfolge der Array-IDs aus der some_chosen_data_in_order-Tabelle für eine bestimmte Zeile erhalten?

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

Die obige Abfrage wählt Elemente aus der Tabelle items mit den IDs: 1,2,3,2,3,5 in dieser Reihenfolge aus.

56
Marcin Kapusta

Die Normalisierung Ihres Tisches wäre wahrscheinlich der beste Rat, den ich Ihnen geben kann.

Das Modul int_array contrib verfügt über eine idx-Funktion, die Ihnen die Indexposition des int im Array angibt. Es gibt auch eine idx-Funktion im snippets-Wiki , die für Arrays beliebiger Datentypen funktioniert.

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)
23
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

2
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