Sdílet prostřednictvím


JAKO (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Určuje, zda určitý znakový řetězec odpovídá zadanému vzoru. Vzor může obsahovat běžné znaky a zástupné znaky. Během porovnávání vzorů musí regulární znaky přesně odpovídat znakům zadaným v řetězci znaků. Zástupné znaky se ale dají spárovat s libovolnými fragmenty řetězce znaků. Použití zástupných znaků zpřístupňuje LIKE operátor flexibilnější než použití = operátorů porovnání řetězců a != řetězců. Pokud některý z argumentů není datový typ řetězce znaků, databázový stroj SQL Serveru ho převede na datový typ řetězce znaků, pokud je to možné.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server a Azure SQL Database:

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Syntaxe pro Azure Synapse Analytics a paralelní datový sklad:

match_expression [ NOT ] LIKE pattern

ESCAPE a STRING_ESCAPE nejsou podporované ve službě Azure Synapse Analytics ani v systému PDW (Analytics Platform System).

Arguments

match_expression

Libovolný platný výraz datového typu znaku.

pattern

Konkrétní řetězec znaků, který se má vyhledat v match_expression, a může obsahovat platné zástupné znaky v následující tabulce. vzor může být maximálně 8 000 bajtů.

Pokud je match_expression datový typ s vyšší prioritou než vzor a délka vzorku je větší než match_expression, při implicitním převodu hodnoty vzoru na typ match_expression se zobrazí chyba zkrácení.

Divoká karta Description Example
% Libovolný řetězec s nulovými nebo více znaky. WHERE title LIKE '%computer%' najde všechny názvy knih se slovem computer kdekoli v názvu knihy.
_ (podtržítko) Libovolný jeden znak. WHERE au_fname LIKE '_ean' najde všechna čtyři písmena křestní jména, která končí písmenem ean (Dean, Seanatd.).
[ ] Libovolný jeden znak v zadaném rozsahu [a-f] nebo sadě [abcdef]. WHERE au_lname LIKE '[C-P]arsen' najde příjmení autora končící a začínající libovolným jediným znakem arsen mezi C a P, například Carsen, Larsen, Karsenatd. V hledání v oblasti se znaky zahrnuté v oblasti můžou lišit v závislosti na pravidlech řazení kolace.
[^] Libovolný jeden znak, který není v zadaném rozsahu [^a-f] nebo sadě [^abcdef]. WHERE au_lname LIKE 'de[^l]%' najde všechna příjmení autora začínající de a kde následující písmeno není l.

escape_character

Znak vložený před zástupný znak označující, že zástupný znak je interpretován jako běžný znak, nikoli jako zástupný znak. escape_character je znakový výraz, který nemá výchozí hodnotu a musí se vyhodnotit pouze na jeden znak.

Typ výsledku

Boolean

Hodnota výsledku

LIKE vrátí hodnotu TRUE, pokud match_expression odpovídá zadanému vzoru.

Remarks

Při porovnávánířetězcůch LIKE Mezi významné znaky patří všechny úvodní nebo koncové mezery. Pokud je porovnáním dotazu vráceny všechny řádky s řetězcem LIKE 'abc ' (abc následovaným jedinou mezerou), řádek, ve kterém hodnota tohoto sloupce je abc (abc bez mezery) vrácena. Koncové prázdné hodnoty ve výrazu, ke kterému se vzor shoduje, se ale ignorují. Pokud je porovnáním dotazu vrácení všech řádků s řetězcem LIKE 'abc' (abc bez mezery), vrátí se všechny řádky, které začínají abc a mají nula nebo více koncových prázdných znaků.

Porovnání řetězců pomocí vzoru, který obsahuje data typu char a varchar , nemusí předat LIKE porovnání z důvodu toho, jak jsou data uložena pro každý datový typ. Následující příklad předá uloženou proceduru místní znakovou proměnnou a pak pomocí porovnávání vzorů vyhledá všechny zaměstnance, jejichž příjmení začínají zadanou sadou znaků.

-- 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 V postupu nejsou vráceny žádné řádky, protože proměnná znaku (@EmpLName) obsahuje koncové hodnoty, kdykoli název obsahuje méně než 20 znaků. LastName Vzhledem k tomu, že sloupec je varchar, nejsou žádné koncové prázdné hodnoty. Tento postup selže, protože koncové prázdné hodnoty jsou významné.

Následující příklad je však úspěšný, protože koncové prázdné hodnoty nejsou přidány do proměnné 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

Tady je soubor výsledků.

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

Porovnávání vzorů pomocí funkce LIKE

LIKE podporuje porovnávání vzorů ASCII a porovnávání vzorů Unicode. Pokud jsou všechny argumenty (match_expression, vzor a escape_character, pokud existují) datové typy znaků ASCII, provede se porovnávání vzorů ASCII. Pokud některý z argumentů je datový typ Unicode, všechny argumenty se převedou na Unicode a provede se porovnávání vzorů Unicode. Při použití dat Unicode (datových typů nchar nebo nvarchar ) s LIKEkoncovými mezerami jsou významné, ale pro data, která nejsou unicode, koncové prázdné hodnoty nejsou významné. Unicode LIKE je kompatibilní se standardem ISO. ASCII LIKE je kompatibilní se staršími verzemi SQL Serveru.

Následující série příkladů ukazuje rozdíly v řádcích vrácených mezi porovnávání vzorů ASCII a 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 porovnání jsou ovlivněna kolací. Pro další informace viz COLLATE (Transact-SQL).

Použití zástupné % znaky

LIKE '5%' Pokud je zadaný symbol, databázový stroj vyhledá číslo 5 následované libovolným řetězcem nuly nebo více znaků.

Například následující dotaz zobrazí všechna zobrazení dynamické správy v AdventureWorks2025 databázi, protože všechny začínají písmeny dm.

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

Pokud chcete zobrazit všechny objekty, které nejsou zobrazení dynamické správy, použijte NOT LIKE 'dm%'. Pokud máte celkem 32 objektů a LIKE najde 13 názvů, které odpovídají vzoru, najde 19 objektů, NOT LIKE které neodpovídají LIKE vzoru.

Nemusí být vždy nalezeny stejné názvy se vzorem, jako LIKE '[^d][^m]%'je . Místo 19 názvů můžete najít pouze 14, se všemi názvy, které začínají d nebo mají m jako druhé písmeno vyloučené z výsledků, a názvy zobrazení dynamické správy. Toto chování je způsobeno tím, že porovnávání řetězců se zápornými zástupnými znaky se vyhodnocují v krocích a současně jeden zástupný znak. Pokud se shoda v libovolném okamžiku vyhodnocení nezdaří, odstraní se.

Použití zástupných znaků jako literálů

Jako literální znaky můžete použít vzor se zástupnými znaky, které odpovídají zástupným znakům. Chcete-li jako literální znak použít zástupný znak, uzavřete zástupný znak do závorek. Následující tabulka uvádí několik příkladů použití klíčového LIKE slova a zástupných [ ] znaků.

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

Porovnávání vzorů s klauzulí ESCAPE

Můžete vyhledat řetězce znaků, které obsahují jeden nebo více speciálních zástupných znaků. Například tabulka slev v databázi zákazníků může ukládat hodnoty slev, které zahrnují znak procenta (%). Chcete-li hledat znak procenta jako znak místo zástupného znaku, je nutné zadat klíčové slovo ESCAPE a řídicí znak. Například ukázková databáze obsahuje sloupec pojmenovaný komentář, který obsahuje text 30%. Pokud chcete vyhledat všechny řádky obsahující řetězec 30% kdekoli ve sloupci komentáře, zadejte klauzuli WHERE, například WHERE comment LIKE '%30!%%' ESCAPE '!'. Pokud řídicí znak a řídicí znak nejsou zadány, databázový stroj vrátí všechny řádky s řetězcem 30!.

Pokud za řídicím znakem ve vzoru LIKE není žádný znak, vzor není platný a funkce LIKE vrátí hodnotu NEPRAVDA. Pokud znak za řídicím znakem není zástupný znak, řídicí znak se zahodí a následující znak se považuje za běžný znak ve vzoru. Mezi tyto znaky patří znak procenta (%), podtržítko (_) a levá závorka ([) zástupné znaky, pokud jsou uzavřeny v dvojitých závorkách ([ ]). Řídicí znaky lze použít v dvojitých závorkách ([ ]), včetně řídicí stříšky (^), spojovníku (-) nebo pravé hranaté závorky (]).

0x0000 (char(0)) je nedefinovaný znak v kolacích Windows a nelze ho zahrnout do funkce LIKE.

Examples

A. Použití funkce LIKE se zástupným znakem %

Následující příklad najde všechna telefonní čísla, která mají v tabulce 415 směrové číslo PersonPhone oblasti.

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

Tady je soubor výsledků.

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. Použití funkce NOT LIKE se zástupným znakem %

Následující příklad najde všechna telefonní čísla v PersonPhone tabulce, která mají jiné směrové číslo oblasti než 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

Tady je soubor výsledků.

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. Použití klauzule ESCAPE

Následující příklad používá klauzuli ESCAPE a řídicí znak k nalezení přesného řetězce 10-15% znaků ve sloupci c1mytbl2 tabulky.

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. Použití zástupných [ ] znaků

Následující příklad najde zaměstnance v Person tabulce s křestní jméno Cheryl nebo Sheryl.

-- Uses AdventureWorks

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

Následující příklad najde řádky pro zaměstnance v Person tabulce s příjmením Zheng nebo Zhang.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

E. Použití funkce LIKE se zástupným znakem %

Následující příklad najde všechny zaměstnance v DimEmployee tabulce s telefonními čísly, které začínají 612na .

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

F. Použití funkce NOT LIKE se zástupným znakem %

Následující příklad najde všechna telefonní čísla v DimEmployee tabulce, které nezačínaly 612.

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

G. Použití funkce LIKE se zástupným znakem _

Následující příklad najde všechna telefonní čísla, která mají směrové číslo oblasti začínající 6 na a končící 2 v DimEmployee tabulce. Zástupný znak % je součástí konce vzoru hledání tak, aby odpovídal všem následujícím znakům v hodnotě sloupce telefonu.

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

Viz také