작성일자 : 2023-11-10
Ver 0.1.1
1. Intro
쿼리를 작성시 WHERE절에서 다양한 방법을 통해 문자열 조회를 할 수 있다.
조회할 문자열에 대해 정확한 문자를 알거나 혹은 정확한 조건으로 제한할 경우에는 등호를 사용한다.
SELECT *
FROM SCOTT.EMP
WHERE ENAME = 'CLARK'
복수개의 조건을 충족하는 경우에는 (NOT) IN 함수나 OR 조건을 이용할 수도 있다.
-- (NOT) IN 함수 사용
SELECT *
FROM SCOTT.EMP
WHERE ENAME IN ('CLARK','BLAKE');
-- OR 함수 사용
SELECT *
FROM SCOTT.EMP
WHERE ENAME = 'CLARK'
OR ENAME = 'BLAKE';
만약 숫자 데이터가 문자형(VARCHAR)으로 들어가 있을 때는 BETWEEN AND를 활용할 수도 있다.
SELECT *
FROM SCOTT.EMP
WHERE TO_CHAR(EMPNO) BETWEEN '7500' AND '7600'
이렇게 문자열을 조회하는 다양한 방법이 있으나, 업무를 할때도 정말 많이 사용하는 함수는 바로 LIKE 함수이다.
LIKE의 장점은 문자열에서 와일드 카드인 '%'를 활용하여 사용자가 조회하고자 하는 문자가 포함된 데이터를 검색할 수 있다.
와이들 카드를 활용한 단순 검색 외에도 여러 개의 문자 검색, 대문자 소문자 구분 없이 검색, NOT(제외) 연산자 사용, 언더바 '_'를 사용하여 문자의 자릿수 검색 등 다양한 조회 방법이 있어 이에 대해 정리해보고자 한다.
2. How to
2-1. 기본 사용
SELECT *
FROM SCOTT.EMP
WHERE ENAME LIKE '%LA%' -- 'LA' 를 포함하는 문자
-- WHERE ENAME LIKE 'LA%' -- 'LA' 로 시작하는 문자
-- WHERE ENAME LIKE '%LA' -- 'LA' 로 끝나는 문자
-- WHERE ENAME LIKE '%L%A%' -- 'L','A'를 포함하는 문자, 'L' 다음에 'A'가 존재해야 함
와일드 카드를 의미하느 '%' 기호를 다양한 방법으로 활용에 상황에 따라 포함, 시작, 종료에 대한 조건을 할당할 수 있다.
특히 '%문자1%문자2%' 의 경우는 순서에도 영향을 받는다는 점을 유의하자.
와일드 카드 사용시 '%'가 어디에 위치하는지에 따라 인덱스 사용 여부가 달라진다. 만약 ENAME 컬럼에 인덱스가 존재한다고 가정했을 때, 오른쪽에 와일드카드(%)가 있으면 인덱스 사용이 가능하다.
ENAME LIKE 'LA%' (인덱스 사용 가능)
ENAME LIKE '%LA' (인덱스 사용 불가능)
2-2. 복수개 검색
여러 개의 문자를 검색하기 위해서는 OR 연산자를 활용하여 조건을 부여할 수 있다.
SELECT *
FROM SCOTT.EMP
WHERE DEPTNO IN (20, 30)
AND (JOB LIKE '%AN%' OR
JOB LIKE 'PRE%' OR
JOB LIKE 'LE%');
2-3. 대문자/소문자 구분 없이 검색
LIKE 함수는 대소문자를 구분하기 때문에, 만약 대소문자 구분 없이 검색하기 위해서는 UPPER, LOWER 함수를 사용하여 조건을 지정해주어야 한다.
-- 소문자 기준으로 검색
SELECT *
FROM SCOTT.EMP
WHERE LOWER(JOB) LIKE LOWER('%ST%')
-- 대문자 기준으로 검색
SELECT *
FROM SCOTT.EMP
WHERE UPPER(JOB) LIKE UPPER('%st%')
2-3. NOT (제외) 연산자 사용
NOT IN 과 마찬가지로 LIKE 함수에도 LIKE 앞쪽에 NOT을 통해 제외 조건을 지정할 수도 있다.
SELECT *
FROM SCOTT.EMP
WHERE LOWER(JOB) NOT LIKE LOWER('%AN%')
2-4. 언더바 ('_') 사용
SELECT *
FROM SCOTT.EMP
WHERE ENAME LIKE '____' -- _ x4 를 통해 이름이 4자리인 사람 조회
-- WHERE ENAME '___D' -- 이름이 4자리인 사람 중 D로 끝나는 사람
-- WHERE ENAME '__R%' -- 이름이 4자리인 사람 중 세번째자리가 R인 사람
(주의사항)
WITH TEMP AS
(
SELECT 'GILDONG_HONG' AS ENAME FROM DUAL UNION ALL
SELECT 'GILDONGHONG' AS ENAME FROM DUAL
)
SELECT *
FROM TEMP
WHERE ENAME LIKE '%_%'
언더바('_') 사용시 주의할 점이 있는데, 언더바는 LIKE에서 자리수를 의미하는 문자이기 때문에 언더바 문자 자체를 직접 조회할 수가 없다. 이에 이런 경우에는 ESCAPE 문자가 필요한데, LIKE 사용시 ESCAPE 문자와 함께 ESCAPE 문자를 지정해준다.
이때, ESCAPE 문자는 검색할 문자에는 존재하지 않는 임의 문자로 지정해야 원하는 조건대로 쿼리가 조회될 것이다.
WITH TEMP AS
(
SELECT 'GILDONG_HONG' AS ENAME FROM DUAL UNION ALL
SELECT 'GILDONGHONG' AS ENAME FROM DUAL
)
SELECT *
FROM TEMP
WHERE ENAME LIKE '%\_%' ESCAPE '\'
3. Wrap up
LIKE 구문은 업무에서 정말 많이 사용된다. Intro에서 언급한 대로 문자열을 조회하는 방법은 다양한 방법들이 있지만, LIKE를 잘 활용한다면 다양한 조건에 대해서 편하게 쿼리를 작성할 수도 있다.
와일드카드 활용, 언더바 활용, NOT, OR, LOWER/UPPER를 통해 자유 자재로 원하는 문자열 조건을 지정해보도록 하자.