[Postgresql] 특정 데이터들을 콤마 구분자로 묶어주는 방법 (CONCAT_WS)
select ip1 || ‘,’ || ip2 from tb_ips 처럼 ip를 가져오고 있는데, ip2가 없을 수 도있다. 이럴땐 뒤에 콤마 구분자가 필요없다.
ip2가 NULL일 때는 콤마(,)가 나오면 안 되니까COALESCE 또는 CASE WHEN을 활용해서 처리하면 된다.
방법 1: CONCAT_WS 사용 (가장 추천, 자동으로 NULL 제외)
PostgreSQL 기준으로 CONCAT_WS(delimiter, ...)는 NULL 값을 자동으로 제외하고
남아 있는 값만 구분자로 연결해줘.
SELECT CONCAT_WS(',', ip1, ip2) AS ip_list
FROM tb_ips;
ip1 = '1.1.1.1', ip2 = NULL→"1.1.1.1"ip1 = '1.1.1.1', ip2 = '2.2.2.2'→"1.1.1.1,2.2.2.2"
방법 2: CASE WHEN 사용
SELECT
CASE
WHEN ip2 IS NULL OR ip2 = '' THEN ip1
ELSE ip1 || ',' || ip2
END AS ip_list
FROM tb_ips;
방법 3: COALESCE 조합
SELECT
ip1 || COALESCE(',' || ip2, '') AS ip_list
FROM tb_ips;
예시문
SELECT CONCAT_WS(',', ip1, ip2) AS ip_list FROM tb_ips;
ip2가 빈값을때도 콤마가 찍힌다. CONCAT_WS(',', ip1, ip2) 는 NULL 값만 무시하고 연결하지만, 빈 문자열(”)은 NULL로 취급하지 않기 때문에 콤마가 생긴다.
해결 방법 — 빈 문자열을 NULL로 변환 (가장 일반적)
SELECT CONCAT_WS(',', ip1, NULLIF(ip2, '')) AS ip_list
FROM tb_ips;
NULLIF(ip2, '')
→ ip2가 빈 문자열이면 NULL로 변환
→ CONCAT_WS()는 NULL을 무시 → 콤마가 사라짐
예시 동작
| ip1 | ip2 | 결과 |
|---|---|---|
| 192.168.0.1 | 10.0.0.1 | 192.168.0.1,10.0.0.1 |
| 192.168.0.1 | ” | 192.168.0.1 |
| 192.168.0.1 | NULL | 192.168.0.1 |
| NULL | 10.0.0.1 | 10.0.0.1 |


