[Oracle] 문자열에서 괄호 안 문자, 숫자 추출 방법

오라클에서 문자열에서 괄호 안의 텍스트, 글자, 문자, 숫자를 추출할 때는 정규식 함수를 사용하면 쉽게 추출할 수 있다. 그러나 오라클 9i 이하인 경우 정규식 함수를 사용할 수 없기 때문에 SUBSTR 함수를 사용해서 추출해야 한다. 정규 표현식을 사용하여 문자를 추출할 때는 딱 정해진 방법이 없고, 상황에 따라서 가장 최적의 방법을 사용하면 된다. 아래의 예제를 참고하여 상황에 따라서 정규 표현식을 추가하거나 변형하여 사용하면 된다.

 

목차
  1. REGEXP_SUBSTR 함수를 사용하여 괄호 안 문자 추출
  2. SUBSTR 함수를 사용하여 괄호 안 문자 추출

 

REGEXP_SUBSTR 함수를 사용하여 괄호 안 문자 추출

문자열에서 괄호와 문자를 같이 추출할 경우

WITH temp AS (
    SELECT 'Oracle Database 19c(19.3)' AS ora_nm FROM dual UNION ALL
    SELECT 'Oracle Database 21c(21.1)' AS ora_nm FROM dual
)

SELECT ora_nm
     , REGEXP_SUBSTR(ora_nm, '\((.*?)\)') AS ora_ver
     , REPLACE(REPLACE(REGEXP_SUBSTR(ora_nm, '\((.*?)\)'), '('), ')') AS ora_ver2
  FROM temp

 

 

REGEXP_SUBSTR 함수를 사용하여 정규 표현식 '\((.*?)\)'을 사용하여 괄호와 괄호 안의 문자를 같이 추출했다. 해당 정규식은 괄호 문자를 추출할 때 자주 사용하는 방법이며, 괄호 안의 문자를 추출할 때는 REPLACE 함수를 사용하여 괄호를 제거해야 한다.

 

괄호를 제외하고 문자나 숫자를 추출할 때는 위의 방법이 조금 복잡해 보이므로 아래의 방법을 사용해도 된다.

 

문자열에서 괄호 안의 문자만 추출할 경우

WITH temp AS (
    SELECT 'Oracle Database 19c(19.3)' AS ora_nm FROM dual UNION ALL
    SELECT 'Oracle Database 21c(21.1)' AS ora_nm FROM dual
)

SELECT ora_nm
     , REGEXP_SUBSTR(ora_nm, '\([^)]+') AS ora_ver
     , SUBSTR(REGEXP_SUBSTR(ora_nm, '\([^)]+'), 2) AS ora_ver2
  FROM temp

 

 

정규 표현식을 사용할 때 미리 닫는 괄호를 제외하고 값을 추출했기 때문에, 여는 괄호 하나만 제거하면 된다.

첫 번째 방법보다는 조금 쿼리 문의 길이가 줄어들었다. 어느 것을 사용하던 결과는 동일하다.

 

문자열에서 괄호에만 숫자가 있을 경우 숫자 추출

WITH temp AS (
    SELECT 'Oracle Database (19.3)' AS ora_nm FROM dual UNION ALL
    SELECT 'Oracle Database 21c(21.1)' AS ora_nm FROM dual
)

SELECT ora_nm
     , REGEXP_SUBSTR(ora_nm, '[0-9.]+') AS ora_ver
  FROM temp

 

 

문자열에서 괄호 안에만 숫자가 존재할 경우 사용할 수 있는 방법이다. 조금 편법처럼 보이지만 정규 표현식은 딱 정해진 해답이 없기 때문에 상황에 따라서 최적의 방법을 찾아서 사용하면 된다.

 

문자열에 괄호 외에 숫자가 존재할 경우 첫 번째 숫자가 잘못 추출될 수 있다.

 

SUBSTR 함수를 사용하여 괄호 안 문자 추출

문자열 끝에 괄호가 있을 경우

WITH temp AS (
    SELECT 'Oracle Database 19c(19.3)' AS ora_nm FROM dual UNION ALL
    SELECT 'Oracle Database 21c(21.1)' AS ora_nm FROM dual
)

SELECT ora_nm
     , REPLACE(SUBSTR(ora_nm, INSTR(ora_nm, '(') + 1), ')') AS ora_ver
  FROM temp

 

 

정규식 함수가 익숙하지 않다면 SUBSTR 함수를 사용하여 괄호 안의 문자를 추출할 수 있다. 괄호가 문자열 끝에 있을 경우 여는 괄호의 위치를 찾아서 끝까지 자른 후 닫는 관호를 제거하면 된다.

 

괄호가 문자열의 끝이 아니라 중간에 존재한다면 아래의 방법을 사용해야 한다.

 

문자열 중간에 괄호가 있을 경우

WITH temp AS (
    SELECT 'Oracle Database 19c(19.3) Release' AS ora_nm FROM dual UNION ALL
    SELECT 'Oracle Database 21c(21.1) Release' AS ora_nm FROM dual
)

SELECT ora_nm
     , REPLACE(SUBSTR(ora_nm, INSTR(ora_nm, '(') + 1), ')') AS ora_ver
     , SUBSTR(ora_nm, INSTR(ora_nm, '(') + 1
            , INSTR(ora_nm, ')') - INSTR(ora_nm, '(') - 1)  AS ora_ver2
  FROM temp

 

 

SUBSTR 함수를 사용하여 문자열의 중간에 존재하는 괄호 안의 문자를 추출할 때는 여는 괄호 위치와 닫는 괄호 위치를 찾아서 문자열을 잘라야 하기 때문에 쿼리문이 조금 복잡해진다.

 

오라클 버전이 10g 미만이거나, 정규식 함수가 익숙하지 않다면 위의 방법을 사용해도 동일한 결과를 얻을 수 있다.

 

댓글

Designed by JB FACTORY