Oracle) Project) REGEXP_REPLACE() 및 정규표현식 이용해 값 리스트 변환한 문자열의 값 가공하기

이지우·2022년 11월 28일
0
  • REPLACE() VS REGEXP_REPLACE()
    : 두 함수는 다른 함수다. REPLACE() 함수에 정규표현식이 사용가능하고 추가로 옵션 인수들을 부여할 수 있는게 REGEXP_REPLACE() 함수이다.

    • REPLACE(컬럼, '찾을문자', '변환할문자')
    • REGEXP_REPLACE(컬럼, '찾을문자 또는 정규표현식', '변환할문자', 검색시작위치, 패턴 일치 발생 횟수(default 0: 모든 값 대체, 그 외 n 번째 발생하는 위치의 문자열만 변환)
      )

  • ex) 영화 검색 시 영화 출연 배우 정보를 담은 배우명|배우영문명|극중역할,배우명|배우영문명|극중역할,... 형식의 리스트를 변환한 문자열에서 극중역할 부분에서 검색어가 검색되어 row 리턴하지 않도록 가공할 필요가 있었다.
    이전엔 service단으로 일단 가져온 뒤, 배열을 반복문 돌려 split 등으로 값 분리한 후 극중역할에 걸려 반환된 객체는 제외하는 식으로 코드를 짰다..
    -> REPLACE()와 다른 REGEXP_REPLACE() 함수가 정규표현식을 사용할 수 있다는 사실을 알게되어 쿼리 개선하였다.

    SELECT  m_a.movieCd, m_a.movieNm, RTRIM(REGEXP_REPLACE(m_a.actorDetail||',' ,'\|.*?\,', ','), ' , ') AS acotrDetail
    FROM tbl_movie m_a
    WHERE REGEXP_REPLACE(m_a.actorDetail||',' ,'\|.*?\,', ',') LIKE REPLACE('%병헌%',' ','') 
    /* REPACE 함수와 REGEXP_REPACE 함수 다르다. / 와일드카드 % 사용 불가 */
    /* 정규표현식: 특수문자쓰고싶으면 앞에 \ 붙여야함, \ : OR, .* : 모든문자, ?:0또는 1회 포함
    -> 배우명|영문명|역할, 배우명||역할, 배우명|영문명|, 배우명|, 모두 커버 */



    -> 배우명만 출력한 뒤 LIKE 이용해 포함여부 검색(사실 영문명까지 남기려 했는데 정규표현식에 서툴러 해내지 못했다..)

    • REGEXP_REPLACE(m_a.actorDetail||',' ,'\|.*?\,', ',')
      콤마,을 기준으로 값들을 구분하므로 REGEXP_REPLACE 함수 실행 전에 ||','를 통해 문자열 마지막에 콤마, 추가해 준 뒤에 원하는 형식의 정규표현식 + 콤마,를 찾을문자로 지정하고, 콤마,를 변환할 문자로 지정해 실행

  • 참고) 와일드카드 %는 WHERE절 LIKE하고만 사용할 수 있는 것 같다.
profile
IT개발 입문합니다.

0개의 댓글