REGEXP_SUBSTR 사용시 구분자로 구분한 값이 공백인 경우 처리 방법 0 3 3,413

by 동희 [SQL Query] [2024.01.11 11:51:11]


안녕하세요...REGEXP_SUBSTR 사용시 구분자로 구분한 값이 공백인 경우에는 매칭순번??이 제대로 안되는것 같은데요..

WITH TMP AS (
  SELECT '120,,,,,,002' TXT FROM DUAL
   UNION ALL
  SELECT '120,A,,C,,,002' TXT FROM DUAL
   UNION ALL
  SELECT '120,A,B,C,D,E,002' TXT FROM DUAL
)
SELECT
   REGEXP_SUBSTR(TXT, '[^,]+', 1, 1) LVL1
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 2) LVL2
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 3) LVL3
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 4) LVL4
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 5) LVL5
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 6) LVL6
 , REGEXP_SUBSTR(TXT, '[^,]+', 1, 7) LVL7
FROM TMP;

다음의 결과가 이렇게 나오는 데요..
LVL1 LVL2 LVL3 LVL4 LVL5 LVL6 LVL7
120 002          
120 A C 002      
120 A B C D E 002

 

실제 원하는 결과는 다음과 같습니다.

LVL1 LVL2 LVL3 LVL4 LVL5 LVL6 LVL7
120           002
120 A   C     002
120 A B C D E 002

 

구분자로 구분시 값이 공백이어도 매칭순번은 구분자의 순서데로 가져오게 할 수 있을까요??

by 동희 [2024.01.11 12:17:09]

gpt가 알려준 자답입니다...

(.*?)(,|$)는 비탐욕적(non-greedy) 매칭을 사용하여 각 레벨의 값을 추출합니다. 

WITH TMP AS (
  SELECT '120,,,,,,002' TXT FROM DUAL
   UNION ALL
  SELECT '120,A,,C,,,002' TXT FROM DUAL
   UNION ALL
  SELECT '120,A,B,C,D,E,002' TXT FROM DUAL
)
SELECT
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 1, NULL, 1) LVL1,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 2, NULL, 1) LVL2,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 3, NULL, 1) LVL3,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 4, NULL, 1) LVL4,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 5, NULL, 1) LVL5,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 6, NULL, 1) LVL6,
  REGEXP_SUBSTR(TXT, '(.*?)(,|$)', 1, 7, NULL, 1) LVL7
FROM TMP;

'(.*?)(,|$)' 이게 어떻게 한다는 의미인지는 모르겠는데..원하는 결과는 나오네요..ㅠㅠ

 


by 마농 [2024.01.11 13:54:47]

. 아무 문자 하나
* 0개 이상 이어지는 문자
? 있어도 되고 없어도 되는
(괄호) 여러개의 서브 패턴을 구별하기 위한 괄호 묶음
$ 문장의 끝
| 또는

1. (.*?) : (아무 문자가 0개이상 이어지는 있어도 되고 없어도 되는거)
2. (,|$) : (컴마 또는 문장의 끝)
이렇게 두개의 괄호 패턴이 연결되는 것을 추출한 뒤에
함수의 네번째 인자에 의해 두개의 서브페턴 중에 1번 패턴부분만 추리라는 뜻입니다.
다시 말하면 컴마까지 포함된 걸 찾은 뒤에 컴마는 제거하고 앞에 꺼만 추출


by 동희 [2024.01.11 14:23:35]

마농님 설명 감사드립니다..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입