LIKE(Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
특정 문자열이 지정된 패턴과 일치하는지를 확인합니다. 패턴은 일반 문자와 와일드카드 문자를 포함할 수 있습니다. 패턴 일치에서 일반 문자는 문자열에 지정된 문자와 정확하게 일치해야 합니다. 그러나 와일드카드 문자는 문자열에서 어느 한 부분만 일치하면 됩니다. 와일드카드 문자를 사용하면 연산자가 LIKE
문자열 비교 연산자를 사용하는 =
!=
것보다 더 유연해집니다. 문자열 데이터 형식의 인수가 하나라도 있을 경우 SQL Server 데이터베이스 엔진에서는 가능할 경우 이를 문자열 데이터 형식으로 변환합니다.
구문
SQL Server 및 Azure SQL Database에 대한 구문:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Azure Synapse Analytics 및 병렬 데이터 웨어하우스용 구문:
match_expression [ NOT ] LIKE pattern
ESCAPE
STRING_ESCAPE
Azure Synapse Analytics 또는 PDW(Analytics Platform System)에서는 지원되지 않습니다.
인수
match_expression
문자 데이터 형식의 유효한 식 입니다.
pattern
match_expression 검색할 특정 문자 문자열이며 다음 표에 유효한 와일드카드 문자를 포함할 수 있습니다. pattern은 최대 8,000바이트까지 지정할 수 있습니다.
match_expression 패턴보다 우선 순위가 높은 데이터 형식이고 패턴 길이가 match_expression보다 큰 경우 패턴 값을 match_expression 형식으로 암시적으로 변환하는 동안 잘림 오류가 발생합니다.
와일드카드 문자 | Description | 예제 |
---|---|---|
% |
0개 이상의 문자를 가진 문자열 | WHERE title LIKE '%computer%' 는 책 제목에서 아무 곳이나 단어가 computer 포함된 모든 책 제목을 찾습니다. |
_ (밑줄) |
단일 문자 | WHERE au_fname LIKE '_ean' 는 (Dean 등Sean )으로 ean 끝나는 네 글자 이름을 모두 찾습니다. |
[ ] |
지정된 범위 [a-f] 또는 집합 [abcdef] 내의 모든 단일 문자입니다. |
WHERE au_lname LIKE '[C-P]arsen' 는 작성자 성을 찾습니다 arsen C Karsen P Carsen Larsen . 범위 검색에서 범위에 포함되는 문자는 데이터 정렬의 정렬 규칙에 따라 다를 수 있습니다. |
[^] |
지정된 범위 [^a-f] 또는 집합 [^abcdef] 내에 없는 모든 단일 문자입니다. |
WHERE au_lname LIKE 'de[^l]%' 는 다음 문자l 가 de 아닌 모든 작성자 성을 찾습니다. |
escape_character
와일드카드가 와일드카드가 아닌 일반 문자로 해석됨을 나타내는 와일드카드 문자 앞에 배치된 문자입니다. escape_character는 기본값이 없는 문자 식이며 하나의 문자만을 반환해야 합니다.
결과 유형
Boolean
결과 값
LIKE
는 match_expression 지정된 패턴과 일치하면 TRUE를 반환합니다.
설명
문자열을 사용하여 LIKE
비교하는 경우 패턴 문자열의 모든 문자가 중요합니다. 중요한 문자에는 모든 선행 및 후행 공백이 포함됩니다. 쿼리에서 비교를 통해 문자열 LIKE 'abc '
이 있는 모든 행을 반환하는 경우(abc
공백이 없는) 해당 열의 값이 abc
abc
반환되지 않는 행이 반환됩니다. 그러나 패턴과 일치되는 식에 있는 후행 공백은 무시됩니다. 쿼리에서 비교를 통해 공백이 없는 문자열 LIKE 'abc'
abc
이 있는 모든 행을 반환하는 경우 공백이 0개 이상인 모든 행 abc
이 반환됩니다.
char 및 varchar 데이터가 포함된 패턴을 사용하는 문자열 비교는 각 데이터 형식에 대해 데이터가 저장되는 방식 때문에 비교를 통과 LIKE
하지 못할 수 있습니다. 다음 예제에서는 로컬 문자 변수를 저장 프로시저에 전달한 다음 패턴 일치를 사용하여 성이 지정된 문자 집합으로 시작하는 모든 직원을 찾습니다.
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName CHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
FindEmployee
프로시저는 이름의 문자가 20개 미만일 때 char 변수(@EmpLName
)에 후행 공백을 포함하므로 일치하는 행을 반환하지 못합니다. 반면에 LastName
열은 varchar이므로 후행 공백을 포함하지 않습니다. 이 프로시저에서는 후행 공백이 의미를 가지므로 실패합니다.
그러나 다음 예에서는 varchar 변수에 후행 공백을 추가하지 않으므로 성공합니다.
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
결과 집합은 다음과 같습니다.
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
LIKE를 사용한 패턴 일치
LIKE
는 ASCII 패턴 일치 및 유니코드 패턴 일치를 지원합니다. 모든 인수(있는 경우 match_expression, pattern 및 escape_character 등)가 ASCII 문자 데이터 형식인 경우 ASCII 패턴 일치가 수행됩니다. 인수 중 하나가 유니코드 데이터 형식인 경우 모든 인수가 유니코드로 변환되고 유니코드 패턴 일치가 수행됩니다. 유니코드 데이터(nchar 또는 nvarchar 데이터 형식)를 LIKE
사용하는 경우 후행 공백은 중요합니다. 그러나 유니코드가 아닌 데이터의 경우 후행 공백은 중요하지 않습니다. 유니코드 LIKE
는 ISO 표준과 호환됩니다. 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
문자로 시작하므로 AdventureWorks2022
데이터베이스에서 모든 동적 관리 뷰를 보여 줍니다.
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
동적 관리 뷰가 아닌 모든 개체를 보려면 NOT LIKE 'dm%'
를 사용하세요. 총 32개의 개체가 있고 패턴과 일치하는 13개의 이름을 찾으면 패턴 NOT LIKE
과 LIKE
일치하지 않는 19개의 개체를 LIKE
찾습니다.
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를 반환합니다. 이스케이프 문자 뒤에 오는 문자가 와일드카드 문자가 아닌 경우 이스케이프 문자는 무시되고 다음에 오는 문자는 패턴 내의 일반 문자로 처리됩니다. 이 문자에는 양쪽 대괄호([ ])로 묶여 있는 백분율 기호(%), 밑줄(_) 및 왼쪽 대괄호([) 와일드카드 문자가 여기에 포함됩니다. 이스케이프 문자는 캐럿(^), 하이픈(-) 및 오른쪽 대괄호(])를 이스케이프 처리하는 것을 포함하여 양쪽 대괄호 문자([ ]) 안에서 사용할 수 있습니다.
0x0000
(char(0))는 Windows 데이터 정렬에서 정의되지 않은 문자이며 LIKE에 포함될 수 없습니다.
예제
A. 와일드카드 문자와 %
함께 LIKE 사용
다음 예에서는 415
테이블에서 지역 번호가 PersonPhone
인 모든 전화 번호를 찾는 방법을 보여 줍니다.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber LIKE '415%'
ORDER BY p.LastName;
GO
결과 집합은 다음과 같습니다.
FirstName LastName Phone
----------------- ------------------- ------------
Ruben Alonso 415-555-124
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)
B. 와일드카드 문자와 함께 %
NOT LIKE 사용
다음 예에서는 PersonPhone
테이블에서 415
외의 다른 지역 번호를 포함하는 모든 전화 번호를 찾는 방법을 보여 줍니다.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber NOT LIKE '415%'
AND p.FirstName = 'Gail'
ORDER BY p.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)
C. 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'),
('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
D. [ ]
와일드카드 문자 사용
다음 예에서는 Person
테이블에서 이름이 Cheryl
또는 Sheryl
인 직원을 찾습니다.
-- Uses AdventureWorks
SELECT BusinessEntityID,
FirstName,
LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
다음 예에서는 Person
테이블에서 성이 Zheng
또는 Zhang
인 직원의 행을 찾습니다.
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC,
FirstName ASC;
GO
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
E. 와일드카드 문자와 %
함께 LIKE 사용
다음 예에서는 DimEmployee
테이블에서 전화 번호가 612
로 시작하는 모든 직원을 찾습니다.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;
F. 와일드카드 문자와 함께 %
NOT LIKE 사용
다음 예제는 DimEmployee
테이블에서 612
로 시작하지 않는 모든 전화 번호를 찾습니다.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
G. 와일드카드 문자와 _
함께 LIKE 사용
다음 예제에서는 DimEmployee
테이블에서 지역 코드가 6
으로 시작해 2
로 끝나는 모든 전화 번호를 찾습니다. 전화 열 값의 모든 후속 문자와 일치하도록 검색 패턴 끝에 % 와일드카드 문자가 포함됩니다.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;