[MSSQL] LIKE 연산자 사용법 (NOT LIKE, 정규식)
- 데이터베이스/MSSQL
- 2021. 12. 19.
SQL Server에서 특정 문자열이 포함되었는지 검색을 할 때에는 LIKE 연산자를 사용하면 된다. SQL Server에서 LIKE 연산자는 타 데이터베이스와 조금 차이가 있는데 기본 옵션이 대소문자를 구분하지 않는다는 것이다. 그리고 정규식의 일부 기능인 문자 범위 패턴만 검색이 가능하다. REGEXP_LIKE와 같은 정규식 LIKE 함수는 없다.
% : 0개 이상의 어떠한 문자열이 존재해도 상관없음 _ : 밑줄(_) 개수 만큰 문자가 존재해야 함 [] : 대괄호([]) 안의 지정된 문자 범위 또는 문자가 존재해야 함 [^] : 대괄호([]) 안의 지정된 문자 범위 또는 문자 외의 문자가 존재해야 함 |
기본 사용법 (LIKE, NOT LIKE, 대소문자 구분)
SELECT *
FROM Languages
WHERE LangName LIKE 'Java%'
'Java'로 시작하는 문자열을 검색한다. 'Java' 뒤에 %(와일드카드)는 어떠한 문자열이 존재해도 된다는 의미이다.
MSSQL에서는 LIKE 검색 시 대소문자를 구분하지 않기 때문에 'Java%'와 'java%'가 동일하게 검색된다.
SELECT *
FROM Languages
WHERE LangName COLLATE Korean_Wansung_CS_AS LIKE 'Java%'
대소문자를 구분하여 검색하기 위해서는 칼럼명 뒤에 "COLLATE Korean_Wansung_CS_AS"을 사용하면 된다.
SELECT *
FROM Languages
WHERE LangName NOT LIKE 'Java%'
NOT LIKE를 사용하면 'Java'로 시작하는 문자열은 제외하고 검색된다.
SELECT *
FROM Languages
WHERE LangName LIKE '%Script'
'Script'로 끝나는 문자열을 검색한다.
SELECT *
FROM Languages
WHERE LangName LIKE '%S%'
시작, 중간, 끝에 'S'가 존재하는 문자열을 검색한다.
검색어의 앞뒤에 와일드카드(%)가 있기 때문에 'S'의 앞뒤에 어떠한 문자열이 존재해도 상관없다.
SELECT *
FROM Languages
WHERE LangName LIKE '%J%S%'
'J'와 'S'가 동시에 존재하는 문자열을 검색한다. 'J'와 'S'의 문자 순서는 일치해야 한다.
밑줄( _ ) 사용법
SELECT *
FROM Languages
WHERE LangName LIKE '____Script'
'Script' 앞에 4자리의 임의 문자가 존재하면 검색된다.
LIKE에서 밑줄(_)을 사용할 경우 밑줄의 개수만큼 임의 문자가 존재하면 된다.
SELECT *
FROM Languages
WHERE LangName LIKE 'Ja__%'
'Ja'로 시작 + 임의 문자 2자리 + 와일드카드(%)
문자 범위 패턴 검색 (정규식)
SELECT *
FROM Languages
WHERE LangName LIKE '%[0-9]%'
0부터 9까지 숫자가 포함된 문자열을 검색한다. (예, [1-9], [1-5], [123789])
문자 범위 패턴을 사용할 때는 대괄호([])로 범위를 감싸면 된다.
정규식 문법과 유사해 보이지만 모든 정규식 문법을 사용할 수 없다.
사용가능한 패턴은 아래와 같다.
[] : 문자 셋 (하나의 문자 셋만 가능), 예) %[0-9]%[A-Z]% 가능, %[0-9][A-Z]% 불가
- : 연속된 문자
^ : 부정
SELECT *
FROM Languages
WHERE LangName LIKE '%[A-Z]%'
A부터 Z까지 알파벳 문자가 포함된 문자열을 검색한다. (예, [A-C], [ABC])
SELECT *
FROM Languages
WHERE LangName LIKE '%[a-z]%'
a부터 z까지 알파벳 문자가 포함된 문자열을 검색한다.
대소문자를 구분하지 않기 때문에 [A-Z]와 동일한 결과를 검색한다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[가-힣]%'
한글이 포함된 문자열을 검색한다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[^a-z]%'
삿갓(^)을 사용하면 a-z 알파벳이 포함되지 않은 문자열이 있을 경우 검색한다.
(숫자와 한글이 포함된 문자열만 조회됨) NOT LIKE와 유사한 의미이다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[0-9가-힣]%'
숫자와 한글이 포함된 문자열을 검색한다.
문자열 범위를 여러 개 연속해서 부여할 수 있다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[0-9a-zA-Z]%'
숫자와 영문자가 포함된 문자열을 검색한다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[12345]%'
1, 2, 3, 4, 5가 하나라도 포함된 문자열을 검색한다.
문자열 범위(0-9, A-Z)를 지정하지 않고 개별 문자를 지정할 수 있다.
SELECT *
FROM Languages
WHERE LangName LIKE '%[ST]%'
'S', 'T'가 하나라도 포함된 문자열을 검색한다.
예약어가 포함된 문자열 검색 (%, _, [, ])
SELECT *
FROM Languages
WHERE LangName LIKE '%[%]%'
;
SELECT *
FROM Languages
WHERE LangName LIKE '%[_]%'
;
SELECT *
FROM Languages
WHERE LangName LIKE '%[[]%'
;
SELECT *
FROM Languages
WHERE LangName LIKE '%[]]%'
LIKE 검색 시 사용하는 예약어(%, _, [, ])가 포함된 문자열을 검색할 때는 대괄호([])를 사용하여 검색하면 된다.