LIKE(Transact-SQL)

특정 문자열이 지정된 패턴과 일치하는지를 확인합니다. 패턴은 일반 문자와 와일드카드 문자를 포함할 수 있습니다. 패턴 일치에서 일반 문자는 문자열에 지정된 문자와 정확하게 일치해야 합니다. 그러나 와일드카드 문자는 문자열에서 어느 한 부분만 일치하면 됩니다. LIKE 연산자에 와일드카드 문자를 사용할 경우 = 및 != 문자열 비교 연산자를 사용하는 것보다 훨씬 융통성이 있습니다. 인수 중 하나라도 문자열 데이터 형식이 아닌 경우 SQL Server 2005 데이터베이스 엔진 은 가능하다면 이를 문자열 데이터 형식으로 변환합니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

인수

match_expression

문자 데이터 형식의 유효한 입니다.

pattern

match_expression에서 검색할 문자열이며 다음의 유효한 와일드카드 문자를 포함할 수 있습니다. pattern은 최대 8,000바이트까지 지정할 수 있습니다.

와일드카드 문자 설명

%

0개 이상의 문자를 가진 문자열

WHERE title LIKE '%computer%'는 책 제목에 'computer' 단어가 있는 모든 책 제목을 찾습니다.

_ (밑줄)

단일 문자

WHERE au_fname LIKE '_ean'은 ean으로 끝나는 모든 4문자 이름을 찾습니다(Dean, Sean 등).

[ ]

지정된 범위([a-f]) 또는 집합([abcdef])에 있는 단일 문자

WHERE au_lname LIKE '[C-P]arsen'은 arsen으로 끝나고 C와 P 사이의 단일 문자로 시작하는 저자의 성을 찾습니다. 예를 들면 Carsen, Larsen, Karsen 등입니다.

[^]

지정된 범위([^a-f]) 또는 집합([^abcdef])에 없는 단일 문자

WHERE au_lname LIKE 'de[^l]%'은 de로 시작하고 이어지는 문자가 l이 아닌 저자의 성을 모두 찾습니다.

escape_character

와일드카드 문자 앞에 입력하여 와일드카드가 일반 문자로 해석되도록 하는 문자입니다. escape_character는 기본값이 없는 문자 식이며 하나의 문자만을 반환해야 합니다.

주의

LIKE를 사용하여 문자열 비교를 수행할 때는 패턴 문자열의 모든 문자가 의미를 가지며 여기에는 선행 및 후행 공백 역시 포함됩니다. 쿼리에서 비교의 결과로 'abc '(abc 다음에 단일 공백이 옴) 문자열이 있는 행을 모두 반환해야 하면 그 열의 값이 abc인 행(공백 없는 abc)은 반환되지 않습니다. 그러나 패턴과 일치되는 식에 있는 후행 공백은 무시됩니다. 쿼리에서 비교의 결과로 'abc'(공백 없는 abc) 문자열이 있는 행을 모두 반환해야 하면 abc로 시작하고 후행 공백이 0개 이상인 행이 모두 반환됩니다.

charvarchar 데이터를 포함하는 패턴을 사용하는 문자열 비교에서는 데이터의 저장 방식으로 인해 LIKE 비교가 성공하지 못할 수도 있습니다. 각 데이터 형식의 저장 방식과 LIKE 비교가 실패할 수 있는 상황을 이해하는 것이 중요합니다. 다음 예에서는 로컬 char 변수를 저장 프로시저에 전달한 다음 패턴 일치를 사용하여 지정된 문자 집합으로 시작하는 성을 가진 모든 직원을 찾는 방법을 보여 줍니다.

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO

FindEmployee 프로시저는 이름의 문자가 20개 미만일 때 char 변수(@EmpLName)에 후행 공백을 포함하므로 일치하는 행을 반환하지 못합니다. 반면에 LastName 열은 varchar이므로 후행 공백을 포함하지 않습니다. 이 프로시저에서는 후행 공백이 의미를 가지므로 실패합니다.

그러나 다음 예에서는 varchar 변수에 후행 공백을 추가하지 않으므로 성공합니다.

USE AdventureWorks;
GO
CREATE PROCEDURE FindEmployee @EmpLName varchar(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT c.FirstName, c.LastName, a.City
FROM Person.Contact c JOIN Person.Address a ON c.ContactID = a.AddressID
WHERE c.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';

결과 집합은 다음과 같습니다. 

FirstName         LastName              City       
---------- ----------------------------------------
Angela             Barbariol            Snohomish
David              Barber               Snohomish

(2 row(s) affected)

LIKE를 사용한 패턴 일치

LIKE는 ASCII 패턴 일치와 유니코드 패턴 일치를 지원합니다. 모든 인수(있는 경우 match_expression, pattern, escape_character 등)가 ASCII 문자 데이터 형식으로 되어 있으면 ASCII 패턴 일치를 수행합니다. 반면에 인수 중 유니코드 데이터 형식이 있으면 모든 인수를 유니코드로 변환하고 유니코드 패턴 일치를 수행합니다. LIKE에서 유니코드 데이터(nchar 또는 nvarchar 데이터 형식)를 사용하면 후행 공백이 의미를 갖지만 유니코드 데이터가 아닌 경우에는 후행 공백에 의미가 없습니다. 유니코드 LIKE는 SQL-92 표준과 호환되며 ASCII LIKE는 SQL Server 이전 버전과 호환됩니다.

다음 예에서는 ASCII 패턴 일치 및 유니코드 LIKE 패턴 일치가 반환하는 행의 차이를 보여 줍니다.

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE col1 LIKE '% King'   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30));
INSERT INTO t VALUES ('Robert King');
SELECT * 
FROM t 
WHERE RTRIM(col1) LIKE '% King'   -- returns 1 row

[!참고] LIKE 비교는 데이터 정렬의 영향을 받습니다. 자세한 내용은 COLLATE(Transact-SQL)를 참조하십시오.

% 와일드카드 문자 사용

LIKE '5%' 기호를 지정하면 데이터베이스 엔진 은 숫자 5 다음 0개 이상의 문자가 이어지는 문자열을 검색합니다.

예를 들어 다음 쿼리는 모두 dm 문자로 시작하므로 AdventureWorks 데이터베이스에서 모든 동적 관리 뷰를 보여 줍니다.

USE AdventureWorks;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO

동적 관리 뷰가 아닌 모든 개체를 보려면 NOT LIKE 'dm%'를 사용하십시오. 총 32개의 개체가 있고 LIKE로 패턴과 일치하는 이름을 13개 찾는다면 NOT LIKE는 LIKE 패턴과 일치하지 않는 19개의 개체를 찾습니다.

LIKE '[^d][^m]%'와 같은 패턴으로는 항상 동일한 이름을 찾지 못할 수 있습니다. 이 패턴에서는 19개의 이름이 아니라 첫 번째 문자가 d이거나 두 번째 문자가 m인 이름을 제외하고 동적 관리 뷰 이름도 아닌 14개의 이름을 찾게 됩니다. 이것은 부정적인 와일드카드 문자가 있는 일치 문자열은 하나의 와일드카드씩 단계별로 평가되기 때문입니다. 평가 중에 일치되지 않는 항목은 제거됩니다.

와일드카드 문자를 리터럴로 사용

와일드카드 패턴 일치 문자를 리터럴 문자로 사용할 수 있습니다. 와일드카드 문자를 리터럴 문자로 사용하려면 와일드카드 문자를 대괄호로 묶으십시오. 다음 표에서는 LIKE 키워드와 [ ] 와일드카드 문자를 사용하는 여러 가지 예를 보여 줍니다.

기호 의미

LIKE '5[%]'

5%

LIKE '[_]n'

_n

LIKE '[a-cdf]'

a, b, c, d 또는 f

LIKE '[-acdf]'

-, a, c, d 또는 f

LIKE '[ [ ]'

[

LIKE ']'

]

LIKE 'abc[_]d%'

abc_d 및 abc_de

LIKE 'abc[def]'

abcd, abce 및 abcf

ESCAPE 절을 사용한 패턴 일치

하나 이상의 특수 와일드카드 문자를 포함하는 문자열을 검색할 수 있습니다. 예를 들어 customers 데이터베이스의 discounts 테이블은 백분율 기호(%)를 포함하는 할인 값을 저장할 수 있습니다. 백분율 기호를 와일드카드 문자가 아닌 일반 문자로 취급하여 검색하려면 ESCAPE 키워드와 이스케이프 문자를 제공해야 합니다. 예를 들어 예제 데이터베이스에는 30%라는 텍스트를 포함하는 comment 열이 있습니다. comment 열의 어느 위치든 30%라는 문자열이 있는 모든 행을 검색하려면 WHERE comment LIKE '%30!%%' ESCAPE '!'와 같은 WHERE 절을 지정합니다. ESCAPE 및 이스케이프 문자를 지정하지 않은 경우 데이터베이스 엔진 은 30이라는 문자열이 있는 모든 행을 반환합니다.

LIKE 패턴에서 이스케이프 문자 뒤에 문자가 없는 경우 해당 패턴은 유효하지 않으며 LIKE는 FALSE를 반환합니다. 이스케이프 문자 뒤에 오는 문자가 와일드카드 문자가 아닌 경우 이스케이프 문자는 무시되고 이스케이프 다음에 오는 문자는 패턴 내의 일반 문자로 처리됩니다. 양쪽 대괄호([ ])로 묶여 있는 백분율 기호(%), 밑줄(_) 및 왼쪽 대괄호([) 와일드카드 문자가 여기에 포함됩니다. 또한 양쪽 대괄호 문자([ ]) 안에서 이스케이프 문자를 사용할 수 있으며 캐럿(^), 하이픈(-) 및 오른쪽 대괄호(])를 이스케이프 처리할 수 있습니다.

결과 형식

Boolean

결과 값

LIKE는 match_expression이 지정된 pattern과 일치하면 TRUE를 반환합니다.

1. LIKE와 % 와일드카드 문자 사용

다음 예에서는 Contact 테이블에서 415 지역 번호가 있는 모든 전화 번호를 찾는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE phone LIKE '415%'
ORDER by LastName;
GO

결과 집합은 다음과 같습니다. 

FirstName               LastName              phone
-----------------       ----------------      ------------
Ruben                   Alonso                415-555-0124
Shelby                  Cook                  415-555-0121
Karen                   Hu                    415-555-0114
John                    Long                  415-555-0147
David                   Long                  415-555-0123
Gilbert                 Ma                    415-555-0138
Meredith                Moreno                415-555-0131
Alexandra               Nelson                415-555-0174
Taylor                  Patterson             415-555-0170
Gabrielle               Russell               415-555-0197
Dalton                  Simmons               415-555-0115

(11 row(s) affected)

2. NOT LIKE와 % 와일드카드 문자 사용

다음 예에서는 Contact 테이블에서 415 외의 다른 지역 번호를 포함하는 모든 전화 번호를 찾는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT FirstName, LastName, Phone
FROM Person.Contact
WHERE Phone NOT LIKE '415%' AND FirstName = 'Gail'
ORDER BY LastName;
GO

결과 집합은 다음과 같습니다. 

FirstName              LastName         Phone
---------              ----------       -------------------
Gail                   Alexander        1 (11) 500 555-0120
Gail                   Butler           1 (11) 500 555-0191
Gail                   Erickson         834-555-0132
Gail                   Erickson         849-555-0139
Gail                   Griffin          450-555-0171
Gail                   Moore            155-555-0169
Gail                   Russell          334-555-0170
Gail                   Westover         305-555-0100

(8 row(s) affected)

3. ESCAPE 절 사용

다음 예에서는 ESCAPE 절과 이스케이프 문자를 사용하여 mytbl2 테이블의 c1 열에서 10-15%와 정확히 일치하는 문자열을 찾는 방법을 보여 줍니다.

USE tempdb;
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'mytbl2')
   DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2
(
 c1 sysname
);
GO
INSERT mytbl2 VALUES ('Discount is 10-15% off');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO

4. [ ] 와일드카드 문자 사용

다음 예에서는 이름이 Cheryl 또는 SherylContact를 찾는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT ContactID, FirstName, LastName 
FROM Person.Contact 
WHERE FirstName LIKE '[CS]heryl';
GO

다음 예에서는 성이 Zheng 또는 ZhangContact 행을 찾는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO

참고 항목

참조

식(Transact-SQL)
함수(Transact-SQL)
SELECT(Transact-SQL)
WHERE(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기