Udostępnij za pomocą


JAK (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Określa, czy określony ciąg znaków pasuje do określonego wzorca. Wzorzec może zawierać zwykłe znaki i symbole wieloznaczne. Podczas dopasowywania wzorca zwykłe znaki muszą dokładnie odpowiadać znakom określonym w ciągu znaku. Symbole wieloznaczne mogą być jednak dopasowywane do dowolnych fragmentów ciągu znaków. Użycie symboli wieloznacznych sprawia, że operator jest LIKE bardziej elastyczny niż użycie = operatorów porównania ciągów i != . Jeśli którykolwiek z argumentów nie jest typem danych ciągu znaków, aparat bazy danych programu SQL Server konwertuje go na typ danych ciągu znaków, jeśli jest to możliwe.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server i usługi Azure SQL Database:

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse:

match_expression [ NOT ] LIKE pattern

ESCAPE i STRING_ESCAPE nie są obsługiwane w usłudze Azure Synapse Analytics lub Analytics Platform System (PDW).

Arguments

match_expression

Dowolne prawidłowe wyrażenie typu danych znaków.

pattern

Określony ciąg znaków do wyszukania w match_expression i może zawierać prawidłowe znaki wieloznaczne w poniższej tabeli. wzorzec może być maksymalnie 8000 bajtów.

Jeśli match_expression jest wyższym typem danych pierwszeństwa niż wzorzec, a długość wzorca jest większa niż match_expression, podczas niejawnej konwersji wartości wzorca na typ match_expression zostanie wyświetlony błąd obcięcia.

Symbol wieloznaczny Description Example
% Dowolny ciąg z zero lub więcej znaków. WHERE title LIKE '%computer%' znajduje wszystkie tytuły książek ze słowem computer w dowolnym miejscu w tytule książki.
_ (podkreślenie) Dowolny pojedynczy znak. WHERE au_fname LIKE '_ean' znajduje wszystkie czteroliterowe nazwy, które kończą się ean na (Dean, Seani tak dalej).
[ ] Dowolny pojedynczy znak w określonym zakresie [a-f] lub ustawić [abcdef]. WHERE au_lname LIKE '[C-P]arsen' Znajduje nazwisko autora kończące się ciągiem arsen i zaczyna się od dowolnego pojedynczego znaku między C i P, na przykład Carsen, Larsen, Karseni tak dalej. W wyszukiwaniu zakresów znaki zawarte w zakresie mogą się różnić w zależności od reguł sortowania sortowania.
[^] Każdy pojedynczy znak nie mieści się w określonym zakresie [^a-f] lub ustawić [^abcdef]. WHERE au_lname LIKE 'de[^l]%' znajduje wszystkie nazwiska autora rozpoczynające się od de i gdzie następująca litera nie ljest .

escape_character

Znak umieszczony przed symbolem wieloznacznymi wskazujący, że symbol wieloznaczny jest interpretowany jako zwykły znak, a nie jako symbol wieloznaczny. escape_character jest wyrażeniem znaków, które nie ma wartości domyślnej i musi być obliczane tylko na jeden znak.

Typ wyniku

Boolean

Wartość wynikowa

LIKE Zwraca wartość TRUE, jeśli match_expression pasuje do określonego wzorca.

Remarks

Podczas porównywania ciągów przy użyciu polecenia LIKEwszystkie znaki w ciągu wzorca są znaczące. Znaki znaczące obejmują wszystkie spacje wiodące lub końcowe. Jeśli porównanie w zapytaniu ma zwracać wszystkie wiersze z ciągiem LIKE 'abc ' (abc po którym następuje pojedyncza spacja), wiersz, w którym wartość tej kolumny to abc (abc bez spacji) nie jest zwracana. Jednak końcowe wartości puste w wyrażeniu, do którego jest dopasowany wzorzec, są ignorowane. Jeśli porównanie w zapytaniu ma zwracać wszystkie wiersze z ciągiem LIKE 'abc' (abc bez spacji), zwracane są wszystkie wiersze rozpoczynające się od abc zera lub większej liczby końcowych wartości pustych.

Porównanie ciągów przy użyciu wzorca zawierającego dane char i varchar może nie przekazywać LIKE porównania ze względu na sposób przechowywania danych dla każdego typu danych. Poniższy przykład przekazuje lokalną zmienną char do procedury składowanej, a następnie używa dopasowania wzorca do znajdowania wszystkich pracowników, których nazwiska zaczynają się od określonego zestawu znaków.

-- 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

W procedurze FindEmployee nie są zwracane żadne wiersze, ponieważ zmienna char (@EmpLName) zawiera końcowe wartości puste, gdy nazwa zawiera mniej niż 20 znaków. Ponieważ kolumna LastName jest varchar, nie ma żadnych spacji końcowych. Ta procedura kończy się niepowodzeniem, ponieważ końcowe wartości puste są znaczące.

Jednak poniższy przykład powiedzie się, ponieważ końcowe wartości puste nie są dodawane do zmiennej 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

Oto zestaw wyników.

FirstName      LastName            City
----------     -------------------- ---------------
Angela         Barbariol            Snohomish
David          Barber               Snohomish
(2 row(s) affected)

Dopasowywanie wzorca przy użyciu funkcji LIKE

LIKE Obsługuje dopasowywanie wzorca ASCII i dopasowywanie wzorca Unicode. Gdy wszystkie argumenty (match_expression, wzorzec i escape_character, jeśli istnieją) są typami danych znaków ASCII, jest wykonywane dopasowywanie wzorca ASCII. Jeśli którykolwiek z argumentów ma typ danych Unicode, wszystkie argumenty są konwertowane na Unicode, a dopasowywanie wzorca Unicode jest wykonywane. Jeśli używasz danych Unicode (nchar lub nvarchar danych) z wartością LIKE, końcowe wartości puste są znaczące, jednak w przypadku danych innych niż Unicode końcowe wartości puste nie są istotne. Unicode LIKE jest zgodny ze standardem ISO. ASCII LIKE jest zgodny z wcześniejszymi wersjami programu SQL Server.

W poniższej serii przykładów przedstawiono różnice w wierszach zwracanych między dopasowaniem wzorca ASCII i Unicode 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

Note

LIKE porównanie ma wpływ na sortowanie. Aby uzyskać więcej informacji, zobacz COLLATE (Transact-SQL).

Używanie symbolu wieloznakowego %

LIKE '5%' Jeśli zostanie określony symbol, aparat bazy danych wyszukuje liczbę5, po której następuje dowolny ciąg zero lub więcej znaków.

Na przykład następujące zapytanie pokazuje wszystkie dynamiczne widoki zarządzania w AdventureWorks2025 bazie danych, ponieważ wszystkie zaczynają się od liter dm.

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

Aby wyświetlić wszystkie obiekty, które nie są dynamicznymi widokami zarządzania, użyj polecenia NOT LIKE 'dm%'. Jeśli masz łącznie 32 obiekty i LIKE znajdziesz 13 nazw pasujących do wzorca, NOT LIKE znajdzie 19 obiektów, które nie pasują do LIKE wzorca.

Nie zawsze można znaleźć te same nazwy ze wzorcem, takim jak LIKE '[^d][^m]%'. Zamiast 19 nazw, można znaleźć tylko 14, ze wszystkimi nazwami rozpoczynającymi się d lub mających m jako drugą literę wyeliminowaną z wyników oraz dynamiczne nazwy widoków zarządzania. To zachowanie jest spowodowane tym, że ciągi zgodne z ujemnymi znakami wieloznacznymi są oceniane w krokach— jeden symbol wieloznaczny naraz. Jeśli dopasowanie zakończy się niepowodzeniem w dowolnym momencie oceny, zostanie wyeliminowane.

Używanie symboli wieloznacznych jako literałów

Można użyć symboli wieloznacznych pasujących znaków jako znaków literału. Aby użyć symbolu wieloznakowego jako znaku literału, należy ująć symbol wieloznaczny w nawiasy kwadratowe. W poniższej tabeli przedstawiono kilka przykładów użycia słowa kluczowego LIKE i symboli [ ] wieloznacznych.

Symbol Meaning
LIKE '5[%]' 5%
LIKE '[_]n' _n
LIKE '[a-cdf]' a, b, c, dlub f
LIKE '[-acdf]' -, a, c, dlub f
LIKE '[ [ ]' [
LIKE ']' ]
LIKE 'abc[_]d%' abc_d i abc_de
LIKE 'abc[def]' abcd, abce i abcf

Dopasowanie wzorca z klauzulą ESCAPE

Możesz wyszukać ciągi znaków, które zawierają co najmniej jeden znak wieloznaczny. Na przykład tabela rabatów w bazie danych klientów może przechowywać wartości rabatów, które obejmują znak procentu (%). Aby wyszukać znak procentu jako znak zamiast jako symbol wieloznaczny, należy podać słowo kluczowe ESCAPE i znak ucieczki. Na przykład przykładowa baza danych zawiera kolumnę o nazwie komentarz, która zawiera tekst 30%. Aby wyszukać wszystkie wiersze zawierające ciąg 30% w dowolnym miejscu w kolumnie komentarza, określ klauzulę WHERE, taką jak WHERE comment LIKE '%30!%%' ESCAPE '!'. Jeśli parametr ESCAPE i znak ucieczki nie są określone, aparat bazy danych zwraca jakiekolwiek wiersze z ciągiem 30!.

Jeśli nie ma znaku ucieczki w wzorcu LIKE, wzorzec nie jest prawidłowy, a funkcja LIKE zwraca wartość FALSE. Jeśli znak ucieczki po znaku ucieczki nie jest symbolem wieloznacznymi, znak ucieczki zostanie odrzucony, a następujący znak jest traktowany jako zwykły znak we wzorcu. Te znaki obejmują znak procentu (%), podkreślenie (_) i lewy nawias kwadratowy ([) symbole wieloznaczne, gdy są one ujęte w podwójne nawiasy ([ ]). Znaki ucieczki mogą być używane w znakach podwójnego nawiasu ([ ]), w tym do ucieczki daszka (^), łącznika (-) lub prawego nawiasu (]).

0x0000 (char(0)) jest niezdefiniowanym znakiem sortowania systemu Windows i nie można go uwzględnić w funkcji LIKE.

Examples

A. Użyj symbolu LIKE z symbolem wieloznacznymi %

Poniższy przykład zawiera wszystkie numery telefonów, które mają kod 415 warstwowy w PersonPhone tabeli.

-- 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

Oto zestaw wyników.

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. Użyj symbolu wieloznakowego % NOT LIKE

W poniższym przykładzie znajduje się wszystkie numery telefonów w PersonPhone tabeli zawierające kody obszaru inne niż 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

Oto zestaw wyników.

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. Używanie klauzuli ESCAPE

W poniższym przykładzie użyto klauzuli ESCAPE i znaku ucieczki, aby znaleźć dokładny ciąg 10-15% znaków w kolumnie c1mytbl2 tabeli.

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. Używanie symboli [ ] wieloznacznych

W poniższym przykładzie znajdują pracowników w Person tabeli z nazwiskiem Cheryl lub Sheryl.

-- Uses AdventureWorks

SELECT BusinessEntityID,
    FirstName,
    LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO

Poniższy przykład zawiera wiersze dla pracowników w Person tabeli z nazwiskami Zheng lub Zhang.

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

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Użyj symbolu LIKE z symbolem wieloznacznymi %

Poniższy przykład znajduje wszystkich pracowników w DimEmployee tabeli z numerami telefonów rozpoczynającymi się od 612.

-- Uses AdventureWorks
  
SELECT FirstName,
    LastName,
    Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;

F. Użyj symbolu wieloznakowego % NOT LIKE

Poniższy przykład znajduje wszystkie numery telefonów w DimEmployee tabeli, które nie zaczynają się od 612.

-- Uses AdventureWorks
  
SELECT FirstName,
    LastName,
    Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;

G. Użyj symbolu LIKE z symbolem wieloznacznymi _

W poniższym przykładzie znaleziono wszystkie numery telefonów, które mają kod obszaru rozpoczynający się od 6 i kończący się w 2DimEmployee tabeli. Znak wieloznaczny % znajduje się na końcu wzorca wyszukiwania, aby dopasować wszystkie następujące znaki w wartości kolumny telefonu.

-- Uses AdventureWorks
  
SELECT FirstName,
    LastName,
    Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;

Zobacz także