홈 › SQL 고급 › 09 / 10

정규식 함수

REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_INSTR
섹션 6진행 0 / 10

5. 자주 하는 실수 (Tip)

실수 1: 패턴을 ^ 와 $ 로 감싸지 않는다

REGEXP_LIKE(phone, '[0-9]{4}') 는 문자열 어딘가에 숫자 네 자리가 있으면 참입니다. 전화번호 전체 형식을 검사하려면 ^ ... $ 로 감쌉니다. 반대로 메모에서 일부를 뽑을 때는 감싸지 않습니다.

실수 2: NOT REGEXP_LIKE 로 NULL 행을 놓친다

예제 3 처럼 NULL 은 참도 거짓도 아니라서 NOT 을 붙여도 걸리지 않습니다. 잘못된 값을 모두 찾는 검증 쿼리에는 IS NULL 을 함께 씁니다.

실수 3: 대량 테이블 WHERE 에 정규식을 쓴다

정규식 조건은 일반 인덱스를 쓰지 못해 전체 행을 읽습니다(중급 09 인덱스). 자주 쓰는 조건이면 함수 기반 인덱스를 만들거나, 정제한 값을 별도 컬럼에 저장해 두고 그 컬럼으로 검색합니다.

실수 4: DB 를 옮기며 문법을 그대로 가져간다

\d 약어, 역참조 표기(\1 과 $1), REGEXP_COUNT 유무, MySQL 의 \\ 두 번 쓰기, 빈 문자열과 NULL 의 차이가 DB 마다 다릅니다. H2 로 확인한 결과를 실제 DB 동작의 근거로 삼지 말고, 대상 DB 에서 다시 확인합니다.

팁

정규화(변경)하기 전에 검증(REGEXP_LIKE)으로 틀린 행을 먼저 뽑아 사람이 확인합니다. 예제의 5번 행처럼 자동 정규화는 오류를 정상처럼 보이게 만들 수 있습니다.