다음을 통해 공유


LIKE(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) SQL 분석 엔드포인트

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

Transact-SQL 구문 표기 규칙

구문

SQL Server 및 Azure SQL Database에 대한 구문:

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Azure Synapse Analytics 및 병렬 데이터 웨어하우스용 구문:

match_expression [ NOT ] LIKE pattern

ESCAPESTRING_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'는 (DeanSean)으로 ean 끝나는 네 글자 이름을 모두 찾습니다.
[ ] 지정된 범위 [a-f] 또는 집합 [abcdef]내의 모든 단일 문자입니다. WHERE au_lname LIKE '[C-P]arsen'는 작성자 성을 찾습니다 arsen C KarsenPCarsenLarsen. 범위 검색에서 범위에 포함되는 문자는 데이터 정렬의 정렬 규칙에 따라 다를 수 있습니다.
[^] 지정된 범위 [^a-f] 또는 집합 [^abcdef]내에 없는 모든 단일 문자입니다. WHERE au_lname LIKE 'de[^l]%'는 다음 문자lde 아닌 모든 작성자 성을 찾습니다.

escape_character

와일드카드가 와일드카드가 아닌 일반 문자로 해석됨을 나타내는 와일드카드 문자 앞에 배치된 문자입니다. escape_character는 기본값이 없는 문자 식이며 하나의 문자만을 반환해야 합니다.

결과 유형

Boolean

결과 값

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

설명

문자열을 사용하여 LIKE비교하는 경우 패턴 문자열의 모든 문자가 중요합니다. 중요한 문자에는 모든 선행 및 후행 공백이 포함됩니다. 쿼리에서 비교를 통해 문자열 LIKE 'abc ' 이 있는 모든 행을 반환하는 경우(abc공백이 없는) 해당 열의 값이 abcabc 반환되지 않는 행이 반환됩니다. 그러나 패턴과 일치되는 식에 있는 후행 공백은 무시됩니다. 쿼리에서 비교를 통해 공백이 없는 문자열 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, patternescape_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 LIKELIKE 일치하지 않는 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_dabc_de
LIKE 'abc[def]' abcd, abceabcf

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;

참고 항목