DB

[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을 무시 → 콤마가 사라짐


예시 동작

ip1ip2결과
192.168.0.110.0.0.1192.168.0.1,10.0.0.1
192.168.0.1192.168.0.1
192.168.0.1NULL192.168.0.1
NULL10.0.0.110.0.0.1

Hi, I’m 똘켓