오라클에서 LIKE IN 을 어떻게 써야 할까요?
방법은... 없습니다...
LIKE 연산은 와일드카드 _ 와 % 로 구성되며, IN/OR 조건이 별도로 없기 때문입니다.
그리하여 LIKE IN 을 사용하려면 조건을 일일이 다 추가해주어야 합니다.
LIKE IN
위의 테이블에서 예를 들면 ename이 AL 로 시작하거나 BL 로 시작하는 단어를 찾는 방법은 아래와 같습니다.
SELECT *
FROM EMP
WHERE 0 = 0
AND (ENAME LIKE 'AL%' OR ENAME LIKE 'BL%');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 91/01/05 2850 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
AL%, BL% 뿐만 아니라 CL%, DL% 을 추가해야 한다고 하면 계속 LIKE ~ OR 부분이 덧붙여질 것입니다.
SELECT *
FROM EMP
WHERE 0 = 0
AND ( ENAME LIKE 'AL%' OR ENAME LIKE 'BL%' OR ENAME LIKE 'CL%' OR ENAME LIKE 'DL%');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 91/01/05 2850 30
7782 CLARK MANAGER 7839 99/09/06 2450 10
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
그렇다면 이렇게 OR 만 계속 추가하는 방법 말고 다른 방법이 어딘가에 있겠죠?
오늘 소개해드리는 것이 정규표현식 REGEXP_LIKE 입니다.
- ename LIKE ('AL%' OR 'BL%') -> 불가
- ename LIKE 'AL%' OR LIKE 'BL%' -> 불가
- ename LIKE IN ('AL%', 'BL%') -> 불가
- ename LIKE 'AL%' OR ename LIKE 'BL%' -> 가능
LIKE IN 과 같은 기능이 없으니 ename LIKE ~ OR ename LIKE ~ OR 를 사용하시거나 REGEXP_LIKE 를 사용하시는 방법이 있습니다.
REGEXP_LIKE syntax
- REGEXP_LIKE ( sourceString , pattern [ , matchParameter] )
- sourceString > 대상 문자열입니다.
- pattern > 표현식입니다.
- matchParameter > (선택변수) 적중매개변수
i -> 대소문자구분 없음(case-insensitive)
c -> 대소문자구분 있음(case-sensitive)
n -> 자료조사 하면서 처음 봤는데
. 문자를 any-character 가 아니라
. 그대로 보는 것 같습니다. (이 기능 쓰시는 걸 한 번도 못 봤습니다.)
m -> 표현시작문자(^) 와 표현종료문자($) 를 나올 때마다 인식합니다.
matchParameter 선택변수는 쓰는 걸 잘 못 봤기 때문에 sourceString 과 pattern 만 확실히 아셔도 괜찮아 보입니다.
예시는 REGEXP_LIKE (ename, '^AL|^BL') 로 진행하였습니다.
- ^ -> 표현식의 시작
- | -> OR 조건입니다.
- AL 로 시작하거나, BL 로 시작하는 표현을 찾습니다.
예시 조회 자료입니다. (그대로 조회 하시면 오류입니다. 확인용으로 주석처리하셔야 합니다.)
SELECT *
FROM EMP
WHERE 0 = 0
AND ENAME LIKE ('AL%' OR 'BL%')
AND ENAME LIKE 'AL%' OR LIKE 'BL%'
AND ENAME LIKE IN ('AL%', 'BL%')
AND (ENAME LIKE 'AL%' OR ENAME LIKE 'BL%')
AND REGEXP_LIKE (ENAME, '^AL|^BL');
REGEXP_LIKE (ENAME, '^AL|^BL') 조건을 설정하여 AL과 BL로 이름이 시작하는 직원을 조회해 보는 예제는 다음과 같습니다.
SELECT *
FROM EMP
WHERE REGEXP_LIKE (ENAME, '^AL|^BL');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 91/01/05 2850 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
위의 식은 다음처럼 ^[AB]L 과 같이 표현할 수도 있답니다. (클릭 시 오라클 정규표현식 자료로 이동합니다)
SELECT *
FROM EMP
WHERE REGEXP_LIKE (ENAME, '^[AB]L');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 91/01/05 2850 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30