1. LIKE '검색하고자 하는 문자열'
검색하고자 하는 문자열이 있을 때를 조건문(원하는 조건에 맞는 행을 조회)으로서 사용한다.
-- 예시로 conditions에 증상 코드가 존재한다고 생각해봅시다.
-- 'DIAB1'로 시작하는 문자열을 조회한다면
WHERE conditions LIKE 'DIAB1%'
띄어쓰기가 포함된 문자열을 조회할 때에는 다음과 같이 할 수 있다.
-- 만약 띄어쓰기가 세 개 이상 포함된 문자열을 조회한다면
WHERE 컬럼1 NOT LIKE '% % % %'
주의: LIKE는 LIKE IN 식으로 사용할 수 없다. 따라서 OR 조건을 사용해야 한다. (REGEXP를 알면 편해지는 이유)
2. NOT LIKE '검색 제외하고 싶은 문자열'
마찬가지로 검색 제외하고자 하는 문자열이 있을 때에도 사용할 수 있다.
-- 'DIAB1'로 시작하는 문자열을 제외하고 조회한다면
WHERE conditions NOT LIKE 'DIAB1%'
3. OR
여러 조건을 검색하고 싶을 때 사이사이에 사용한다.
예시 상황: conditions 컬럼에서 증상코드를 검색하는데, 증상 코드가 DIAB1으로 시작하는 증상만 검색할 것이다. 그러나 conditions 컬럼에는 "DIAB10089 기침" 뿐 만 아니라, "복통 DIAB12003" 식으로, 증상코드와 증상이 띄어쓰기로 구분되어 적혀있는 경우도 있다. 또한 "FEDIAB109"와 같이 'DIAB1'을 단순히 포함하는 증상코드도 있다.
-- 'DIAB1'로 시작하는 증상코드가 있는 모든 문자열을 조회하고 싶다면
WHERE conditions LIKE 'DIAB1%'
OR conditions LIKE '% DIAB1%'
4. REGEXP('chr1|chr2|...')
정규표현식을 이용하여 검색한다. 많이 쓰이는 방식이고 특히 한국어의 경우 참 사용하기 좋은 것 같다.
하지만 방금과 같은 경우에는 차라리 LIKE가 더 편하다고 느꼈다. (이 포스트를 작성하게 된 계기이기도...)
LIKE 를 사용하는 경우
다음처럼 사용할 수 있다. 증상코드가 정확히 해당 문자열로 시작하는 경우를 위해 "DIAB1%"로 뒤 숫자나 문자열의 한계가 없음을 알려주고, 띄어쓰기가 존재하면서 증상코드가 존재하기도 하므로 "% DIAB1"도 함께 적어 검색해야 한다.
-- 방금 위에서 보았던 OR의 사용 경우이다.
-- 'DIAB1'로 시작하는 코드가 있는 모든 경우를 조회한다면
WHERE conditions LIKE 'DIAB1%'
OR conditions LIKE '% DIAB1%'
REGEXP() 를 사용하는 경우
의외로 복잡하게 쓰게 된다. 다음의 경우는 전체 문자열이 정확하게 'DIAB1'로 시작하는 경우(conditions: LIKE 'DIAB1%') 만 커버한다.
WHERE conditions REGEXP '^DIAB1' -- MySQL
WHERE REGEXP_LIKE(conditions, '^DIAB1') -- Oracle
그럼 공백도 있을테니 공백 뒤에 이것으로 시작하는 코드를 조회하기 위해 \b를 이용한다.
그러나 그렇게 쓴 다음의 경우는 전체 문자열이 정확히 'DIAB1'로 시작하거나 숫자가 붙는 경우를 검색하지 못한다.
WHERE conditions REGEXP '\\bDIAB1\\b' -- MySQL
WHERE REGEXP_LIKE(conditions, '\bDIAB1\b') -- Oracle
그렇기에, 숫자를 붙여서 일단 아래처럼 고친다. 그러나 이 경우는 'FEDIAB1'도 함께 검색된다.
WHERE conditions REGEXP 'DIAB1[0-9]*' -- MySQL
WHERE REGEXP_LIKE(conditions, 'DIAB1[0-9]*') -- Oracle
그리고 거기에 단어 경계를 표현하는 \b을 이용한다. 테스트 결과'DIAB1'로 시작하는 경우도 커버할 수 있다. 그러나 " +DIAB100"처럼 문자가 아닌 무언가가 붙은 경우도 함께 검색된다.
WHERE conditions REGEXP '\\bDIAB1[0-9]*\\b' -- MySQL
WHERE REGEXP_LIKE(conditions, '\bDIAB1[0-9]*\b') -- Oracle
띄어쓰기를 할 때는 \s
따라서 앞에 올 수 있는 것은 정확히 공백만이어야 함을 명시할 수 있는 \s를 이용한다.
(보기 좋게 바 양 옆으로 띄어쓰기를 해두었습니다.)
WHERE conditions REGEXP '^DIAB1[0-9]* | \\sDIAB1[0-9]*' -- MySQL
WHERE REGEXP_LIKE(conditions, '^DIAB1[0-9]* | \sDIAB1[0-9]*') -- Oracle
💪 실수 주의
정규표현식 오용: 다중 조건을 걸어 REGEXP('chr1|chr2|...')를 사용할 때 정규표현식을 제대로 지키지 않으면 엉뚱한 결과를 얻을 수 있다.
-- 다음의 쿼리절은 'DIAB1'으로 시작하는것이 아니라 중간에 무언가가 들어가도 검색하게 된다 (각 철자가 들어간 'DIAB201' 도 출력)
WHERE conditions REGEXP(' DIAB1%'|'DIAB1%')
\b 의 오용: 만약 OR를 생각해서 다음처럼 쓰면 의미가 없게 된다.
WHERE conditions REGEXP 'DIAB1[0-9]*|\bDIAB1[0-9]*'
어떤 문제를 풀다 쓰게 되었는지>>>
해당 문제를 Oracle로 풀었을 때의 결과인데 오라클 한 사람이 어지간히 없었나보다.

정규표현식 맨날 까먹는 사람의 포스팅 끝 🤣
'SQL' 카테고리의 다른 글
| [연습문제풀이] MUTUAL FRIEND (feat.코테) (0) | 2024.05.16 |
|---|---|
| 1주차 EDA (0) | 2024.05.12 |
| 데이터 분석기법 - 리텐션 (0) | 2024.05.11 |