[SQL] ( , )콤마로 이루어진 문자열을 다중행으로 변경하기.
리트리버J
·2020. 11. 7. 09:07
728x90
"822,501,504"로 이루어진 문자열을 콤마 구분자로 다중 행으로 만들 수 없을까?
다중행으로 만들면, 서브쿼리로 그 값과 일치하는 컬럼을 가져 올 수 있을 것이다.
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 |
728x90
'SQL > Oracle' 카테고리의 다른 글
[SQL / 기본문법] BETWEEN AND / LIKE (%, _) / IN / 연산자 우선순위 (0) | 2020.12.28 |
---|---|
[SQL / 기본문법] NVL / IS NULL / DISTINCT / AS / || / !=, ^=, <> (0) | 2020.12.28 |
[SQL]ROWNUM >= 2가 안된다면 (0) | 2020.11.15 |
[SQL] myBatis 동적 SQL 문자열 비교 (0) | 2020.11.11 |
[SQL] 사용자별 댓글 별점 평균 구하기 (2) | 2020.11.10 |