복붙노트

[SQL] PostgreSQL의 배열 요소 순서와 배열 형으로 가입, 어떻게 구현하는 방법?

SQL

PostgreSQL의 배열 요소 순서와 배열 형으로 가입, 어떻게 구현하는 방법?

나는 데이터베이스에 두 개의 테이블이 있습니다

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[],
);

이 테이블은 배열 유형 필드가 포함되어 있습니다. 각 행은 특정 순서 테이블 항목에서 ID의 값을 포함합니다. 예를 들면 : {2,4,233,5}.

지금, 나는 배열 유형의 요소에 대한 주문 테이블 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를 유지하지 않습니다. 당신이 날 어떻게 특정 행에 대한 some_chosen_data_in_order 테이블에서 배열 ID를 순서에 해당 된 항목 테이블에서 데이터를 얻을하는 데 도움이 수 있습니까?

해결법

  1. ==============================

    1.

    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를.

  2. ==============================

    2.아마 테이블을 정상화하는 것은 내가 당신을 줄 수있는 최고의 조언이 될 것입니다.

    아마 테이블을 정상화하는 것은 내가 당신을 줄 수있는 최고의 조언이 될 것입니다.

    int_array있는 contrib 모듈은 당신에게 배열의 INT의 인덱스 위치를 줄 것이다 IDX 기능이 있습니다. 코드 조각 배열의 모든 데이터 유형의 동안 그 일을 위키에 또한 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)
    
  3. ==============================

    3.

    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)
    

  4. ==============================

    4.

    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 = ?])
    
  5. from https://stackoverflow.com/questions/2486725/postgresql-join-with-array-type-with-array-elements-order-how-to-implement by cc-by-sa and MIT license