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