[SQL] ( , )콤마로 이루어진 문자열을 다중행으로 변경하기.

리트리버J

·

2020. 11. 7. 09:07

728x90
"822,501,504"로 이루어진 문자열을 콤마 구분자로 다중 행으로 만들 수 없을까?

다중행으로 만들면, 서브쿼리로 그 값과 일치하는 컬럼을 가져 올 수 있을 것이다.

일단, 콤마 구분자를 정규표현식으로 구분해보자.


1
Select Regexp_Substr('822,501,504','[^,]+'13) catecode FROM dual;
cs

Regexp_Substr이란 ? 

Regexp_Substr('a,b,c,d', '[^,]+', 숫자1, 숫자2)  = 정규표현식

'a,b,c,d' = 콤마로 이루어진 문자열
'[^,]+' = 콤마로 구분 할 것임
숫자1 = 기준점
숫자2 = 기준점으로부터 몇번째?

위의 쿼리의 결과는
[( , )콤마구분자로 1번째 기준점으로부터 3번째의 값이므로,
504이다.

이렇게 되면 하나의 행 밖에 가져오질 못한다.

그럴 때는 CONNECT BY LEVEL을 이용하자.

CONNECT BY LEVEL이란? 

1
2
SELECT LEVEL FROM DUAL
CONNECT BY LEVEL <=10;
cs


LEVEL은 1부터 조건까지 자동으로 올라간다.
Select Regexp_Substr('822,501,504','[^,]+', 1, 4) catecode FROM dual
첫번째 기준점부터 4는 존재하지 않는 번호이므로, ( null )을 출력하게된다.
그러므로, IS NOT NULL 조건을 부여하게 되면, 콤마 구분자의 모든 문자열의 인덱스를 행으로 출력 할 수 있다.

1
2
Select Regexp_Substr('822,501,504','[^,]+'1, level) catecode FROM dual
Connect By Regexp_Substr('822,501,504''[^,]+'1, level) Is not Null;
cs




이제는 원하는 결과를 들고 와야 한다.


1
2
3
select * from goods_category
where catecode in (Select Regexp_Substr('822,501,504','[^,]+'1, Level) catecode FROM dual
Connect By Regexp_Substr('822,501,504''[^,]+'1, level) Is Not Null);
cs


다중 행을 WHERE절의 서브쿼리로 이용하면, 그 결과에 맞는 값을 들고 올 수 있다.
다중행은 ( = )이 아닌, ( in )을 사용하는 것을 잊지 말자.




CATENAME 컬럼의 값만 가져오고 싶기 때문에, *이 아닌 catename을 적용시킬 것이다.


1
2
3
select catename from goods_category
where catecode in (Select Regexp_Substr('822,501,504','[^,]+'1, Level) catecode FROM dual
Connect By Regexp_Substr('822,501,504''[^,]+'1, level) Is Not Null);
cs


( , )구분자로 이루어진 문자열을 다중행으로 변경, Where절의 서브쿼리에 집어넣어
원하는 값을 가져왔다.










728x90