REPLACE() VS REGEXP_REPLACE()
: 두 함수는 다른 함수다. REPLACE() 함수에 정규표현식이 사용가능하고 추가로 옵션 인수들을 부여할 수 있는게 REGEXP_REPLACE() 함수이다.
- REPLACE() VS REGEXP_REPLACE() https://jdm.kr/blog/8
- REPLACE() https://gent.tistory.com/228
- REGEXP_REPLACE() https://lee-mandu.tistory.com/40
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||',' ,'\|.*?\,', ',')
||','
를 통해 문자열 마지막에 콤마, 추가해 준 뒤에 원하는 형식의 정규표현식 + 콤마,를 찾을문자로 지정하고, 콤마,를 변환할 문자로 지정해 실행
- 정규표현식 개념
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D- 정규표현식 활용 https://gent.tistory.com/267
- TRIM() https://gent.tistory.com/521
tip) R/LTRIM() 이용하면 공백과 문자 한번에 제거 가능