정규식을 이용하여, 중접된 괄호안에 특정 값을 찾고 싶습니다. 1 4 967

by 곰탱이 [SQL Query] 정규식 [2021.06.09 00:36:49]



정규식을 이용하여 중첩된 괄호에 안에
쌍으로 구분된 괄호가 여러개 존재하는데, 
그 안에 특정 값이 포함된 부분을 찾고 싶습니다.

예로 아래와 같은 쿼리에서 'A'가 포함된 괄호안의 값을 하나의 정규식으로 찾고 싶습니다
미리 감사드립니다.


SELECT STR
    , REGEXP_SUBSTR(STR, '\([^()]*\)', 1, 1) AS T1 
    , REGEXP_SUBSTR(STR, '\([^()]*\)', 1, 2) AS T2
    , REGEXP_SUBSTR(STR, '\([^()]*\)', 1, 3) AS T3
FROM
(
    SELECT '1 ( (A), ( (A, B), D, (E, F)) ) 2' AS STR FROM DUAL 
)

---------------------- [결과]

 STR                               | T1  | T2     | T3     |
-----------------------------------+-----+--------+--------+
 1 ( (A), ( (A, B), D, (E, F)) ) 2 | (A) | (A, B) | (E, F) |

 

by 마농 [2021.06.09 08:27:08]

위 설명 만으로는 공통된 규칙이 잘 안보이네요.
왜? D 는 빠지고 (E,F) 는 포함되는지?
t4, t5 가 추가될 수 있는지? t3 까지만 뽑으면 되는지?
좀 더 다양한 예제와 공통된 규칙에 대한 설명이 필요합니다.


by 곰탱이 [2021.06.09 13:14:50]

재가 정확하게.기술하지 않았네요

 

괄호안에 값을 추출하는데

그 안에 괄호 포함되어있는 데이터는 제외하며, A 라는 문자가 포함 된 값을 추출하려 합니다.

WITH TBL
AS
(

    SELECT '1 ( (A), ( (A, B), D, (E, F)) ) 2' AS STR FROM DUAL 

)
SELECT 
REGEXP_SUBSTR(STR, '\([^()]*\)', 1, LEVEL) AS COL
FROM TBL
CONNECT BY LEVEL <= 5;


결과
(A)
(A, B)
(E, F)
null
null

이렇게 나오는데 
REGEXP_SUBSTR(STR, '\([^()]*\)', 1, LEVEL) 
위의 이 정규식을 수정하여 A 라는 문자는 포함 된 결과만 도출하려 합니다.

조건에 만족하지 않는 건 null 로 나오게 하려 합니다.

 


by 마농 [2021.06.09 20:14:04]
SELECT str
     , lv
     , REGEXP_SUBSTR(str, '\([^()]*A[^()]*\)', 1, lv) x
  FROM (SELECT '1 ( (A), ( (A, B), D, (E, F)) ) 2' str FROM dual)
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(str, '\([^()]*A[^()]*\)')
;

 


by 곰탱이 [2021.06.09 23:29:48]

감사합니다~

꾸벅

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