[Oracle] 오라클 LIKE 사용법 완벽 정리 (여러개, 패턴, 대소문자)

오라클 SQL에서 LIKE 연산자는 자주 사용하는 구문 중 하나이다. 문자열에서 와일드카드(%)를 사용하여 원하는 문자가 포함된 자료를 쉽게 검색할 수 있다. 단순 검색 외에도 대문자 소문자 구분 없이 검색, NOT 연산자 사용, 여러 개의 문자를 검색, 언더바(_)를 사용하여 자릿수 검색 등 다양한 사용법이 있으니 아래를 참고하기 바란다.

 

기본 사용법

"SC"로 시작하는 이름 검색

SELECT *
  FROM emp
 WHERE ename LIKE 'SC%'	

 

 

"SC"로 시작하는 이름을 검색한다. 와일드카드(%) 자리에는 어떠한 문자가 존재해도 상관없다.

 

"ER"로 끝나는 이름 검색

SELECT *
  FROM emp
 WHERE ename LIKE '%ER'

 

 

"ER"로 끝나는 이름을  검색한다.

 

"AM"을 포함하고 있는 이름 검색

SELECT *
  FROM emp
 WHERE ename LIKE '%AM%'

 

 

"AM"이 이름은 앞, 뒤, 중간 어딘가에 존재하면 검색한다.

 

"M"과 "I"를 포함하고 있는 이름 검색

SELECT *
  FROM emp
 WHERE ename LIKE '%M%I%'

 

 

"M"과 "I"가 동시에 존재하는 이름을 검색한다. 단, "M" 다음에 "I"가 존재해야 한다.

 

고급 사용법

대소문자 구분 없이 검색

SELECT *
  FROM emp
 WHERE LOWER(job) LIKE 'sales%'

 

 

LIKE는 대소문자를 구분하여 검색하기 때문에, 대소문자 구분 없이 검색하기 위해서는 UPPER, LOWER 함수를 사용하여 컬럼의 값을 치환 후 검색해야 한다.

 

WHERE LOWER(job) LIKE 'sales%'

WHERE LOWER(job) LIKE LOWER('Sales%')

WHERE UPPER(job) LIKE 'SALES%'

WHERE UPPER(job) LIKE UPPER('Sales%')

 

"SALES"로 시작하는 직군 제외하고 검색 (반대로 검색)

SELECT *
  FROM emp
 WHERE deptno = 30
   AND job NOT LIKE 'SALES%'

 

 

LIKE는 해당 문자를 포함한 자료를 검색하지만, NOT LIKE를 사용하면 해당 문자를 포함하지 않는 데이터를 조회할 수 있다.

 

LIKE를 여러 개 사용하여 검색

SELECT *
  FROM emp
 WHERE deptno IN (20, 30)
   AND (job LIKE 'SALES%' OR
        job LIKE 'MAN%' OR
        job LIKE 'ANAL%')

 

 

LIKE를 사용하여 여러 개의 문자를 검색하기 위해서는 OR 연산자를 사용하여 여러 개의 LIKE 조건을 부여해야 한다. 조금 더 간편하게 사용하기 위해서는 오라클 10g부터 사용 가능한 REGEXP_LIKE 정규식 함수를 사용하면 된다.

 

[Oracle] 오라클 여러개(다중) LIKE 검색 방법 (REGEXP_LIKE 함수)

 

<알아두면 유용한 팁>

특정 조건을 전체 조회 또는 특정 코드만 조회 시 LIKE 연산자를 사용하면 편리함
(단 컬럼 값의 길이(자리수)가 일정해야함)
in_deptno 변수에 NULL을 전달하면 전체조회, 코드(10, 20, 30)를 전달하면 해당 코드만 조회

WHERE deptno LIKE :in_deptno || '%'

 

언더바( _ ) 사용법

다섯 자리 이름만 검색

SELECT *
  FROM emp
 WHERE ename LIKE '_____'

 

 

언더바(_)를 사용하여 검색할 문자열의 자릿수를 결정하여 검색이 가능하다. 위의 예제는 다섯 자리의 이름만 검색한다.

 

다섯 자리 이름 중 마자막 문자가 "S"인 이름 검색

SELECT *
  FROM emp
 WHERE ename LIKE '____S'

 

 

이름의 앞 네 자리는 임의 문자가 존재(자릿수 중요)하고, 마지막 다섯 번째는 "S"가 존재하는 이름만 검색한다.

 

세째자리가 "A"인 이름 검색 사용법

SELECT *
  FROM emp
 WHERE ename LIKE '__A%'

 

 

이름 앞의 두 자리는 임의 문자가 존재하고, 세 번째 자리는 "A"이며 이후는 어떠한 문자가 존재해도 상관없이 검색된다.

 

언더바( _ )가 포함된 이름을 조회 시 엉뚱한 결과가 조회  (주의!!)

WITH temp AS (
	SELECT 'STEVEN_KING' AS ename FROM dual UNION ALL
	SELECT 'StevenMarkle' AS ename FROM dual
)

SELECT *
  FROM temp
 WHERE ename LIKE '%_%'

 

 

언더바(_)는 LIKE에서 사용하는 패턴 문자이기 때문에 해당 문자를 직접 조회할 수가 없다. 언더바(_)가 존재하는 이름만 검색하였지만 결과는 언더 바가 존재하지 않는 이름까지 검색된다.

 

언더바 ( _ ) 문자를 조회 시 ESCAPE 문자를 사용

WITH temp AS (
	SELECT 'STEVEN_KING' AS ename FROM dual UNION ALL
	SELECT 'StevenMarkle' AS ename FROM dual
)

SELECT *
  FROM temp
 WHERE ename LIKE '%\_%' ESCAPE '\'

 

 

언더바(_)가 존재하는 데이터를 검색하기 위해서는 ESCAPE 문자를 언더바(_)에 붙여서 사용해야 한다. LIKE 문에 ESCAPE 문자를 넣고 뒤에 ESCAPE 문자를 선언하면 된다.

 

ESCAPE 문자는 검색할 문자에 존재하지 않는 임의 문자를 지정하면 된다.

예) LIKE '%\_%' ESCAPE '\'

    LIKE '%#_%' ESCAPE '#'

    LIKE '%$_%' ESCAPE '$'

 

LIKE 사용 시 인덱스 스캔

ename 컬럼에 인덱스 존재 시 LIKE를 사용할 때 오른쪽에 와일드카드(%)가 있으면 인덱스를 태울 수 있음

 

ename LIKE 'SC%' (인덱스를 태울 수 있음)

ename LIKE '%SC' (인덱스를 태울 수 없음)

 

예제쿼리(테이블뷰포함).txt
0.00MB

 

 

댓글

Designed by JB FACTORY