[ORACLE] LIKE 여러개 , LIKE IN 을 어떻게 할까? REGEXP_LIKE 사용하기 [오라클]

주제 : ename 이 'AL' 로 시작하거나 'BL' 로 시작하는 직원을 찾아봅시다.

오라클에서 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 입니다.

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

댓글