LIKE (języka Transact-SQL)

Sprawdza, czy dany ciąg znaków pasuje do określonego wzorca.Wzorzec może zawierać zwykłe znaki i symbole wieloznaczne.Podczas dopasowywania do wzorca zwykłe znaki muszą dokładnie pasować do znaków określonych w ciągu znaków.Jednak symbole wieloznaczne mogą zostać dopasowane do dowolnych fragmentów ciągu znaków.Możliwość korzystania z symboli wieloznacznych sprawia, że operator LIKE oferuje większe możliwości niż operatory porównania ciągów = i != .Jeśli którykolwiek z argumentów nie jest typu danych ciąg znaków, SQL Server Database Engine konwertuje ją na typie danych ciąg znaków, jeśli jest to możliwe.

Topic link iconKonwencje składni języka Transact-SQL

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Argumenty

  • match_expression
    Jest ważne w każdym wyrażenie znaku typu danych.

  • pattern
    Is the specific string of characters to search for in match_expression, and can include the following valid wildcard characters.pattern can be a maximum of 8,000 bytes.

    Znaki symboli wieloznacznych

    Description

    Przykład

    %

    Dowolny ciąg zawierający zero lub większą liczbę znaków.

    WHERE tytuł LIKE % komputer % wyszukuje wszystkie tytuły książek ze słowem „ komputer „ w dowolnym miejscu tytuł książki.

    _ (podkreślenie)

    Dowolny pojedynczy znak.

    WHERE au_fname tak, jak "_ean" wyszukuje wszystkie cztery litery imiona, kończyć ean (Dean, on i tak dalej).

    [ ]

    Każdy pojedynczy znak w określonym zakresie ([a-f]) lub zestaw ([abcdef]).

    WHERE au_lname LIKE "[C-P] arsen" znajdzie Autor nazwiska kończą się ciągiem arsen i rozpoczynając dowolny pojedynczy znak między C i P, na przykład Carsen Larsen, Karsen i tak dalej.W wyszukiwaniach zakres znaków, w zakresie mogą się różnić w zależności od sortowanie regulamin sortowanie.

    [^]

    Dowolny pojedynczy znak nie do określonego zakres ([^ a-f]) lub ([^ abcdef]).

    WHERE au_lname LIKE "de [^ l] %" Tworzenie wszystkich nazwisk, począwszy od de i gdzie następujące litera nie jest l.

  • escape_character
    Is a character that is put in front of a wildcard character to indicate that the wildcard should be interpreted as a regular character and not as a wildcard.escape_character is a character expression that has no default and must evaluate to only one character.

Typy wynik

Boolean

Wartość wyniku

LIKE zwraca wartość PRAWDA, jeśli match_expression pasuje do określonej pattern.

Remarks

Po wykonaniu porównania ciągów za pomocą tak jak wszystkie znaki w ciąg deseń są istotne.Dotyczy to także spacji wiodących i końcowych.W przypadku porównywania w kwerendzie do zwrócenia wszystkich wierszy z ciąg LIKE "abc" (abc następuje pojedyncza spacja), nie jest zwracana wiersza, w których wartości w tej kolumnie jest abc (abc bez spacji).Jednak końcowe spacje w wyrażeniu, do którego zostanie dopasowany wzorzec, są ignorowane.Porównanie kwerendy ma zwracać wszystkie wiersze z ciągiem LIKE "abc" (abc bez spacji), zwracane są wszystkie wiersze, które zaczynają się abc i mieć zero lub więcej spacji końcowych.

Za pomocą wzorca, który zawiera porównanie ciąg char i varchar danych nie może przekazywać LIKE porównania ze względu na sposób przechowywania danych. Należy zapoznać się magazynu danych każdego typu i gdzie może się nie powieść LIKE porównania.W poniższym przykładzie przekazuje lokalnego char Zmienna, procedura przechowywana, a następnie używa wzorzec dopasowania, aby znaleźć wszystkich pracowników, których ostatni nazwy zaczyna określonego zestaw znaków.

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

W FindEmployee Procedura, są zwracane nie wiersze, ponieważ char zmienne)@EmpLName) zawiera końcowe spacje za każdym razem, gdy nazwa zawiera mniej niż 20 znaków. Ponieważ LastName Kolumna jest varchar, nie ma żadnych spacji końcowych. Ta procedura nie działa, ponieważ spacje końcowe są istotne.

Jednak w poniższym przykładzie zakończy się pomyślnie, ponieważ spacje końcowe nie są dodawane do varchar Zmienna.

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

Here is the result set.

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

(2 row(s) affected)

Wzorzec dopasowania przy użyciu LIKE

LIKE pasujące do wzorca obsługuje ASCII i Unicode pasujące do wzorca.Jeśli wszystkie argumenty ()match_expression, pattern, a escape_characterJeśli jest obecna) są typy danych znaków ASCII, dopasowywanie wzorzec ASCII jest wykonywane. Jeśli jeden z argumentów typu danych Unicode, wszystkie argumenty są konwertowane na standard Unicode i dopasowania wzorca Unicode jest wykonywane.Podczas używania (Unicode) danychnchar lub nvarchar typy danych) z LIKE, spacje końcowe są znaczące; nie obsługujących kodu Unicode w przypadku danych spacje końcowe nie są jednak istotne. Unicode LIKE jest zgodne z ISO standardowych.ASCII LIKE jest zgodny ze starszymi wersjami SQL Server.

Poniżej przedstawiono szereg przykłady pokazujące różnice w wierszy zwracanych między ASCII i Unicode LIKE pasujące do wzorca.

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

Uwaga

Podobnie jak porównań dotyczy sortowanie.Aby uzyskać więcej informacji zobacz COLLATE (Transact-SQL).

Za pomocą znaków wieloznacznych %

Jeśli LIKE ' 5 % ' symbol jest określony, Database Engine wyszukuje numer 5, a po nim dowolny ciąg znaków zerowej lub większej liczby.

Na przykład, poniższa kwerenda pokazuje wszystkie widoki dynamicznego zarządzania AdventureWorks Baza danych, ponieważ uruchamiają z literami. dm.

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

Aby wyświetlić wszystkie obiekty, które nie są dynamiczne zarządzanie widokami, należy użyć NOT LIKE 'dm%'. Jeśli masz całkowitej 32 obiektów i LIKE znajduje 13 nazw, które pasuje do wzorca, NOT LIKE znajduje 19 obiektów, które nie odpowiadają LIKE wzorca.

Użytkownik może nie zawsze znaleźć takich samych nazwach, deseniem takich jak LIKE '[^d][^m]%'. Zamiast nazw 19 może się okazać tylko 14 z nazwami, które zaczynają się d lub m jako drugi literę usunięte z wyniki i dynamiczny widok zarządzania nazwami. Dzieje się tak, ponieważ dopasowanie ciągów znaków wieloznacznych ujemne są oceniane w krokach, jeden symbol wieloznaczny w danej chwili.Jeśli nie pasuje na każdym etapie oceny, jest wyeliminowane.

Za pomocą polecenia wieloznacznych jako literały

Wzorzec dopasowania znaków wieloznacznych: można użyć w dosłownej postaci znaków.Aby użyć symbolu wieloznacznego jako znak literałowy, należy ująć w nawiasy z symbolem wieloznacznym.W poniższej tabela przedstawiono kilka przykładów użycia LIKE słów kluczowych i symboli wieloznacznych [].

Symbol

Znaczenie

PODOBNIE JAK 5 [%]

5%

LIKE '[_] n'

_n

LIKE "[a-cdf]"

b, c, d lub f

LIKE "[-acdf]"

-, c i d, f

PODOBNIE JAK '['

[

PODOBNIE JAK "]"

]

LIKE "% d abc [_]"

abc_d i abc_de

LIKE "abc [def]"

Abcd i abce abcf

Wzorzec dopasowania z klauzulę ESCAPE

Można wyszukiwać ciągi znaków zawierające jedną lub więcej znaków specjalnych symboli wieloznacznych.Na przykład Rabaty tabelaKlienci bazy danych mogą być przechowywane w wartości rabatu, które należą do niej znaku procentu (%).Aby wyszukać znak procentu jako znak, a nie jako symbol wieloznaczny, należy podać ESCAPE słowa kluczowego i znak anulowania.Na przykład przykładowa baza danych zawiera kolumna o nazwie komentarz , zawierającej tekst, 30 %.Aby wyszukać wszystkie wiersze zawierające ciąg znaków, 30 % w dowolnym miejscu w komentarz kolumna, określ klauzula WHERE, takie jak WHERE comment LIKE '%30!%%' ESCAPE '!'. Jeżeli nie podano ESCAPE i znak anulowania, Database Engine Zwraca wszystkie wiersze w ciąg 30.

Jeśli w strukturze LIKE jest nie znaków po znak anulowania, wzorzec nie jest prawidłowy i podobne zwraca wartość FALSE.Znak po znaku anulowania nie jest symbolem wieloznacznym, jest odrzucany znak anulowania, a po anulowania znaku jest traktowany jako zwykłego znaku w strukturze.Zawiera znak procentu (%), znaku podkreślenia (_) i po lewej nawias kwadratowy ([]) symboli wieloznacznych, gdy są one ujęte w podwójne nawiasy kwadratowe ([]).Ponadto w znaki podwójny nawias kwadratowy ([]), może zawierać znaki escape i znaku daszka (^), myślnik (-) i mogą mieć zmienione znaczenie za prawy nawias kwadratowy (]).

Przykłady

A.Za pomocą LIKE z symbolem wieloznacznym w postaci %

Następujący przykład wyszukuje wszystkie numery telefonów, których numer kierunkowy 415 w Contact Tabela.

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

Here is the result set.

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)

B.Za pomocą NOT LIKE z symbolem wieloznacznym w postaci %

Następujący przykład wyszukuje wszystkie numery telefonów w Contact tabela, które mają inne niż numery kierunkowe 415.

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

Here is the result set.

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

W poniższym przykładzie użyto ESCAPE Klauzula i znak anulowania, aby wyszukać ciąg znaków dokładnie 10-15% kolumna c1 z mytbl2 Tabela.

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

D.Korzystanie z symboli wieloznacznych]

Następujący przykład wyszukuje Contacts z imię Cheryl lub Sheryl.

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

W poniższym przykładzie znajdzie wierszy Contacts w ostatnim nazwy Zheng lub Zhang.

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