안녕하세요. 데이터값 중간에 쉼표를 제거하고 싶습니다.
여러 컬럼값을 이어 붙였는데요. 컬럼과 컬럼 사이에 빈값이 있는 경우 쉼포를 제거 하고 싶습니다.
현재 결과값 : 과자,사과,,수박,,딸기
최종 결과값 : 과자,사과,수박,딸기
결과값을 세로로 반환한다음 널값을 제거 한 후 다시 가로로 반환하는 방법밖에 생각이 않나는데 다른 방법 있을까요?
WITH TAB AS
(
SELECT '과자' AS A
, '사과' AS B
, '' AS C
, '수박' AS D
, '' AS E
, '딸기' AS F
FROM DUAL
)
SELECT A || ',' ||B ||',' || C || ',' || D ||','|| E||',' || F
FROM TAB
WITH TAB AS
(
SELECT '과자' AS A , '사과' AS B , '' AS C , '수박' AS D, '' AS E, '딸기' AS F FROM DUAL union all
SELECT '과자' AS A , '사과' AS B , '' AS C , '' AS D, '' AS E, '딸기' AS F FROM DUAL union all
SELECT '' AS A , '사과' AS B , '' AS C , '수박' AS D, '' AS E, '딸기' AS F FROM DUAL union all
SELECT '과자' AS A , '사과' AS B , '' AS C , '수박' AS D, '' AS E, '' AS F FROM DUAL
)
select text
, rtrim(ltrim(regexp_replace(text, ',+', ','), ','), ',') replace_comma
, regexp_replace(regexp_replace(text, ',+', ','), '^,|,$', '') clean_comma
from (
SELECT A || ',' ||B ||',' || C || ',' || D ||','|| E||',' || F as text
FROM TAB
)
WITH t AS
(
SELECT '과자' a, '사과' b, '' c, '수박' d, '' e, '딸기' f FROM dual
UNION ALL SELECT '', '사과', '', '수박', '', '딸기' FROM dual
UNION ALL SELECT '', '사과', '', '수박', '딸기', '' FROM dual
)
SELECT a, b, c, d, e, f
-- 1. 널이 아닐때만 컴마 붙이기 + 맨앞 컴마 제거
, SUBSTR( NVL2(a, ','||a, '')
|| NVL2(b, ','||b, '')
|| NVL2(c, ','||c, '')
|| NVL2(d, ','||d, '')
|| NVL2(e, ','||e, '')
|| NVL2(f, ','||f, '')
, 2) x1
-- 2. 3단계 replace 로 다중 컴마 제거 + 맨앞/맨뒤 컴마 제거
, TRIM(BOTH ',' FROM
REPLACE(REPLACE(REPLACE(
a||','||b||','||c||','||d||','||e||','||f
, ',', '@,'), ',@', ''), '@', '')) x2
-- 3. 정규식을 이용한 다중컴마 제거 + 맨앞/맨뒤 컴마 제거
, REGEXP_REPLACE(REGEXP_REPLACE(
a||','||b||','||c||','||d||','||e||','||f
, ',+', ','), '^,|,$') x3
FROM t
;
정규식이 있었군요.. 두분 다 감사합니다.