특정 테이블에 아래의 형태로 데이터가 저장되어있다고 가정하자
[결제 테이블]: sales
| cnt(int) | total(int) | product_id(string) |
|---|---|---|
| 2 | 2000 | 1,2 |
| 4 | 12000 | 3,4,5,6 |
[제품 테이블]: product
| product_id(int) | product_name(str) | price(int) |
|---|---|---|
| 1 | a | 1000 |
| 2 | b | 1000 |
| 3 | c | 3000 |
| 4 | d | 3000 |
| 5 | e | 3000 |
| 6 | f | 3000 |
아래의 쿼리로 조회하게 되는데
SELECT *
FROM sales
| price | cnt | total | product_id | product_name |
|---|---|---|---|---|
| 1000 | 2 | 2000 | 1,2 | a,b |
| 3000 | 4 | 12000 | 3,4,5,6 | c,d,e,f |
로 product_name를 조회하거나 json형태로 조회해야 하는 상황이 발생했다.
product_id의 문자열을 ','로 split하여 where 조건의 in절에 넣어야 한다. 그럴떄 아래의 쿼리로 작성이 가능하다.
STRING_TO_ARRAY()와 ANY()를 사용하면된다.
SELECT PRODUCT_NAME
FROM PRODUCT
WHERE PRODUCT_ID = ANY(STRING_TO_ARRAY('1,2,3,4,5,6', ',')::INT[])
조회가 잘된다....
이제 쿼리문으로 조회하는 걸로 바꿔보도록 하자
SELECT A.*
, (SELECT STRING_AGG(PRODUCT_NAME) FROM PRODUCT_ID = ANY(STRING_TO_ARRAY(A.PRODUCT_ID, ',')))
FROM SALES A
끗!