본문 바로가기
DBMS/PostgreSQL

[PostgreSQL] 열을 행으로 변환하기

by 드바 2024. 1. 4.

UNNEST 함수

배열(array) row로 변경

SELECT unnest(ARRAY['V1','V2','V3','V4','V5']) AS c1 ;
 c1
----
 V1
 V2
 V3
 V4
 V5
(5 rows)

 

배열 개수가 다른경우 NULL 로 표시함

select * from unnest(ARRAY[1,2], ARRAY['foo','bar','baz']) as x(a,b);
 a |  b 
---+-----
 1 | foo
 2 | bar
   | baz

 

구분자가 있는 컬럼을 행으로 변경

테스트 테이블

select * from tab1;
 id |      text_data      
----+---------------------
  1 | apple,orange,banana
  2 | dog,cat,bird,fish
  3 | red,green,blue
(3 rows)

 

쉼표를 구분자로 배열로 변환

SELECT id, string_to_array(text_data,',') AS text_array
FROM tab1
;
 id |      text_array       
----+-----------------------
  1 | {apple,orange,banana}
  2 | {dog,cat,bird,fish}
  3 | {red,green,blue}
(3 rows)

 

쉼표로 구분된 열을 행으로 변경

SELECT id, unnest(string_to_array(text_data,',')) AS text_array
FROM tab1
;
 id | text_array 
----+------------
  1 | apple
  1 | orange
  1 | banana
  2 | dog
  2 | cat
  2 | bird
  2 | fish
  3 | red
  3 | green
  3 | blue
(10 rows)

 

regexp_split_to_table 함수 사용

SELECT id, regexp_split_to_table(text_data,',') FROM tab1 ; 
 id | regexp_split_to_table 
----+-----------------------
  1 | apple
  1 | orange
  1 | banana
  2 | dog
  2 | cat
  2 | bird
  2 | fish
  3 | red
  3 | green
  3 | blue
(10 rows)

 

여러 컬럼을 행으로 변경

cross join lateral 사용

-- 테스트 테이블
SELECT * FROM tab2 ;
 id | column1 | column2 | column3 
----+---------+---------+---------
  1 |      10 |      20 |      30
  2 |      40 |      50 |      60
(2 rows)

-- cross join lateral 사용
SELECT c1
FROM tab2 
CROSS JOIN LATERAL (
 VALUES (column1), (column2), (column3)
) AS t(c1);
 c1 
----
 10
 20
 30
 40
 50
 60
(6 rows)

 

댓글