본문으로 바로가기
TaeyoungKim.dev

SQL LIKE %와 _ 차이: 밑줄을 문자 그대로 검색하는 ESCAPE 사용법

DB/SQL작성 약 3분 읽기TaeyoungKim
LinkedInX

task_로 시작하는 코드만 찾으려고 LIKE 'task_%'를 썼다. 그런데 결과에 taskA01도 있다. 데이터가 잘못 들어온 걸까? 이 경우에는 데이터보다 검색 패턴의 밑줄을 먼저 의심해야 한다. SQL의 _는 눈에 보이는 밑줄 한 글자가 아니라, 아무 문자나 한 글자 들어갈 수 있다는 표시다.

SQL LIKE 밑줄 검색에 taskA01이 섞이는 이유

작은 코드 목록을 만들어 직접 확인해 보자. task_01은 찾고 싶지만 taskA01은 제외하고 싶은 상황이다.

sql
CREATE TABLE tasks (code TEXT NOT NULL);

INSERT INTO tasks (code) VALUES
  ('task'), ('task_'), ('task_01'),
  ('taskA'), ('taskA01'), ('todo_01');

SELECT code
FROM tasks
WHERE code LIKE 'task_%'
ORDER BY code;
text
taskA
taskA01
task_
task_01

task_%는 task 다음에 최소 한 글자를 요구한다. 그래서 task는 빠지고, 밑줄 대신 A가 들어간 taskA와 taskA01은 남는다. 쿼리는 시킨 대로 일했는데, 우리가 밑줄에게 다른 일을 맡긴 셈이다.

LIKE의 %와 밑줄은 각각 몇 글자를 뜻할까?

%는 0글자 이상, _는 정확히 1글자를 뜻한다. 같은 목록에 LIKE 'task%'를 적용하면 task 자체도 포함된다. 뒤의 %가 0글자와도 일치하기 때문이다. 반면 LIKE 'task_'는 task_와 taskA처럼 뒤에 한 글자만 붙은 값과 일치한다.

그림에서 두 검색은 같은 코드를 대상으로 한다. 첫 패턴의 _는 A도 받아들이지만, 아래 패턴은 밑줄 자체를 요구한다.

실제 밑줄을 찾으려면 ESCAPE를 어떻게 쓸까?

밑줄을 와일드카드가 아닌 문자로 취급하려면 이스케이프 문자를 정한다. 여기서는 !를 선택했다. !_는 문자 _를, 마지막 %는 그 뒤에 올 수 있는 임의 길이의 문자열을 뜻한다.

sql
SELECT code
FROM tasks
WHERE code LIKE 'task!_%' ESCAPE '!'
ORDER BY code;
text
task_
task_01

ESCAPE '!'가 빠지면 !는 그냥 문자이고 _는 여전히 와일드카드다. SQLite의 LIKE 표현식 설명에 따르면 ESCAPE 뒤에는 한 글자짜리 문자를 지정하며, 그 문자 뒤의 _ 또는 %를 문자 그대로 매칭할 수 있다. 위 예제는 SQLite에서 검증했다. 다른 DBMS에서 쓰는 문자열 리터럴·대소문자 비교 규칙은 해당 제품 설정과 함께 확인해야 한다.

검색 결과가 예상과 다르면 무엇을 확인할까?

먼저 찾으려는 것이 패턴인지 실제 문자 값인지 정하자. task로 시작하는 모든 코드를 찾는다면 LIKE 'task%'가 맞고, 정확히 task_와 같은 값 하나만 찾는다면 code = 'task_'가 더 분명하다. task_로 시작하는 코드를 찾는다면 LIKE 'task!_%' ESCAPE '!'가 의도에 맞는다.

사용자가 입력한 검색어를 코드에서 LIKE 패턴에 붙일 때도 같은 선택이 필요하다. 입력한 _와 %를 검색 문법으로 허용할지, 글자 그대로 찾을지 먼저 정하고 두 경우를 테스트하자. 패턴을 고쳐도 실제 밑줄이 아닌 코드가 나온다면 ESCAPE가 빠졌는지, 패턴 끝의 %가 너무 넓게 잡혀 있는지 확인한다. 작은 목록에서 포함할 값과 제외할 값을 함께 적어 보는 것이 긴 쿼리를 눈으로만 읽는 것보다 빠르다.

핵심 요약

LIKE의 %는 0글자 이상, _는 정확히 1글자를 대신한다. 그래서 LIKE 'task_%'에는 taskA01도 들어온다. 밑줄 자체로 시작하는 코드만 찾으려면 LIKE 'task!_%' ESCAPE '!'처럼 이스케이프 문자를 명시하자. 결과가 이상할 때는 패턴이 허용하는 문자와 실제로 원하는 값을 나란히 놓고 비교하면 된다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#SQL LIKE#SQL 와일드카드#LIKE ESCAPE#SQL 밑줄 검색

함께 읽으면 좋은 글