LIKE (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 na ciąg znaków Aparat baz danych programu SQL Server konwertuje ją na typ danych na ciąg znaków, jeśli jest to możliwe.
Składnia
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Argumenty
match_expression
Wszelkie obowiązuje wyrażenie typu danych znaków.pattern
Jest określony ciąg znaków do wyszukiwania w match_expressioni może zawierać znaki prawidłowe symbol wieloznaczny.patternmoże być maksymalnie 8000 bajtów.Symbol wieloznaczny
Opis
Przykład
%
Dowolny ciąg zawierający zero lub większą liczbę znaków.
W przypadku gdy tytuł, takich jak % komputera % znajduje wszystkie tytuły książek ze słowem "komputer" w dowolnym miejscu tytuł książki.
_ (podkreślenie)
Dowolny pojedynczy znak.
GDZIE au_fname, takich jak "_ean" znajduje wszystkie cztery litery imion z ean (Dean, Janusz i tak dalej).
[ ]
Dowolny pojedynczy znak w ramach określonego zakres ([a-f]) lub zestaw ([abcdef]).
WHERE au_lname podobnie jak "arsen [C-P]" znajduje autorów nazwiska kończą się ciągiem arsen i począwszy od dowolny pojedynczy znak między c a P, na przykład Carsen, Larsen, Karsen i tak dalej.zakres wyszukiwania znaki znajdujące się w zakres może być różna w zależności od reguły sortowania sortowanie.
[^]
Dowolny pojedynczy znak nie w ramach określonego zakres ([^ a-f]) lub zestaw ([^ abcdef]).
WHERE au_lname podobnie jak "de [^ l] %" Autor wszystkich nazwisk, począwszy od de i gdy następującą literę nie jest l.
escape_character
Jest znakiem umieszczone z przodu symbolu wieloznacznego, aby wskazać, że symbol wieloznaczny powinien być interpretowany jako zwykły znak, a nie jako symbol wieloznaczny.escape_characterjest znak wyrażenie , brak domyślnej i musi dawać w wyniku tylko jeden znak.
Typy wyników
Boolean
Wartość wyniku
Podobnie jak zwraca wartość PRAWDA, jeśli match_expression pasuje do określonego pattern.
Uwagi
Po uruchomieniu porównywania ciąg za pomocą tak jak wszystkie znaki ciąg są znaczące.Obejmuje to spacji wiodących i końcowych.Jeżeli porównanie w kwerendzie ma zwracać wszystkie wiersze z ciąg "abc" (abc następuje pojedyncza spacja), wiersza, w którym wartość danej kolumna jest abc (abc bez spacji) nie jest zwracana.Jednakże spacjami, wyrażenie , do którego wzorzec jest spełnione, są ignorowane.Jeżeli porównanie w kwerendzie ma zwracać wszystkie wiersze z ciąg takich jak "abc" (abc bez spacji), zwracane są wszystkie wiersze, które zaczynają się abc i mieć zero lub więcej spacjami.
Porównanie ciąg przy użyciu wzoru, który zawiera char i varchar danych nie mogą przechodzić PODOBNEGO porównania ze względu na sposób przechowywania danych.Należy przeanalizować magazynu danych każdego typu i gdzie porównanie PODOBNEGO może zakończyć się niepowodzeniem.Poniższy przykład przekazuje lokalnym char zmiennej do procedura składowana i następnie zastosowanie dopasowania wzorca do znalezienia wszystkich pracowników, których nazwiska zaczynają określonego zestaw znaków.
USE AdventureWorks2008R2;
GO
CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
W FindEmployee procedury, są zwracane żadne wiersze, ponieważ char zmiennej (@EmpLName) zawiera spacje końcowe w każdym przypadku, gdy nazwa zawiera mniej niż 20 znaków.Ponieważ LastName kolumna jest varchar, nie ma żadnych pustych końcowe.Ta procedura nie działa, ponieważ spacje końcowe są znaczące.
Natomiast poniższy przykład powiedzie się, ponieważ spacje końcowe nie są dodawane do varchar zmienną.
USE AdventureWorks2008R2;
GO
CREATE PROCEDURE FindEmployee @EmpLName varchar(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
Oto zestaw wyników.
FirstName LastName City
---------- ----------------------------------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Dopasowania za pomocą takich jak
Dopasowanie do wzorca obsługuje ASCII I Unicode dopasowania wzorca.Gdy wszystkie argumenty (match_expression, pattern, i escape_character, jeśli jest obecna) są typy danych znaków ASCII, ASCII odpowiedników wzorca.Jeśli jest jeden z argumentów typu danych Unicode, wszystkie argumenty są konwertowane na standard Unicode i Unicode odpowiedników wzorca.Podczas korzystania z danych Unicode (nchar lub nvarchar typów danych) z PODOBNYCH, spacje końcowe są znaczące; Jednak dla danych standardu Unicode spacjami nie są znaczące.Unicode jak jest zgodny ze standardem ISO.ASCII jak jest zgodny z wcześniejszymi wersjami programu SQL Server.
Poniżej przedstawiono serii przykłady pokazujące różnice w wierszy zwracanych między ASCII i Unicode podobne dopasowania 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
Ostrzeżenie
Podobnie jak porównań dotyczy sortowanie.Aby uzyskać więcej informacji, zobacz SORTOWANIE (Transact-SQL).
Przy użyciu symbolu wieloznacznego %
Jeśli podobny 5% " symbol jest określony, Aparat baz danych wyszukuje numer 5 następuje dowolny ciąg znaków zero lub więcej.
Na przykład, poniższa kwerenda zawiera listę wszystkich widoków dynamicznego zarządzania w AdventureWorks2008R2 bazy danych, ponieważ uruchamiają z literami dm.
USE AdventureWorks2008R2;
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, NOT LIKE 'dm%'.Jeśli suma 32 obiektów i jak stwierdza 13 nazw, które pasuje do wzorca nie jak stwierdza, że 19 obiektów, które odpowiada wzorcowi PODOBNEGO.
Użytkownik może nie zawsze znaleźć tej samej nazwy wzorkiem takich jak LIKE '[^d][^m]%'.Zamiast nazw 19 może znaleźć tylko 14 z nazwami, które rozpoczynają się od d lub m jako drugi literę wyeliminowane z wynikii nazwy dynamiczny widok zarządzania .Jest tak, ponieważ ciągi dopasowanie za pomocą znaków wieloznacznych ujemne są oceniane w krokach jeden symbol wieloznaczny w czas.Jeśli dopasowanie nie powiedzie się w dowolnym miejscu oceny, jest wyeliminowane.
Używanie symboli wieloznacznych jako literały
Za pomocą wzorca wieloznacznych dopasowywania w dosłownej postaci znaków.Aby użyć znaku wieloznacznego jako znak literałowy, należy ująć w nawiasy symbol wieloznaczny.W poniższej tabela przedstawiono przykłady kilku przy użyciu słowa kluczowego PODOBNEGO oraz wieloznacznych [].
Symbol |
Znaczenie |
---|---|
PODOBNIE JAK 5 [%] |
5% |
Podobnie jak '[_] n' |
_n |
Podobnie jak "[a-cdf]" |
, b, c, d i f |
Podobnie jak ' [-acdf] " |
-,, c, d i f |
PODOBNIE JAK '[' |
[ |
PODOBNIE JAK "]" |
] |
Podobnie jak "abc [_] % d" |
abc_d i abc_de |
Podobnie jak "abc [def]" |
Abcd, abce i abcf |
Dopasowania z klauzuli zwalniającej od odpowiedzialności
Można wyszukiwać ciągi znaków zawierające jeden lub więcej znaków specjalnych symboli wieloznacznych.Na przykład discounts tabela w customers wartości rabatów, które należy zawrzeć znak procentu (%) mogą być przechowywane w bazie danych.Aby wyszukać znak procentu jako znak, a nie jako symbol wieloznaczny, należy podać słowo kluczowe EWAKUACJI i znak anulowania.Na przykład, przykładowa baza danych zawiera kolumna o nazwie comment zawierający tekst 30%.Aby wyszukać wszystkie wiersze zawierające ciąg o 30% gdziekolwiek w comment kolumna, określ klauzula WHERE takich jak WHERE comment LIKE '%30!%%' ESCAPE '!'.Jeśli nie określono EWAKUACJI i znak anulowania, Aparat baz danych zwraca wszystkie wiersze w ciąg 30.
Jeśli występuje żaden znak po znaku anulowania w deseniu PODOBNYM, wzorzec nie jest prawidłowy i podobne zwraca wartość FALSE.Znak po znaku anulowania nie jest symbolem wieloznacznym, odrzucone znak anulowania, a znak następujący escape jest traktowana jako zwykłych znaków w strukturze.Zawiera znak procentu (%), znaku podkreślenia (_) i lewy nawias kwadratowy symboli wieloznacznych ([]), gdy są ujęte w podwójne nawiasy ([]).Ponadto w podwójne nawiasy ([]), anulowania używanych znaków i daszek (^), myślnik (-) i mogą mieć zmienione znaczenie za prawy nawias kwadratowy (]).
Przykłady
A.Za pomocą takich jak z symbolem wieloznacznym %
Następujący przykład wyszukuje wszystkie numery telefonów, których numer kierunkowy 415 w PersonPhone tabela.
USE AdventureWorks2008R2;
GO
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-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 %
Następujący przykład wyszukuje wszystkie numery telefonów w PersonPhone tabela , które zawierają kody obszarów innych niż 415.
USE AdventureWorks2008R2;
GO
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.Za pomocą klauzulazwalniającej od odpowiedzialności
W poniższym przykładzie użyto ESCAPE klauzula i znak anulowania, aby znaleźć dokładny ciąg 10-15% w 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.Używanie symboli wieloznacznych]
Następujący przykład wyszukuje pracowników na Person tabela z nazwą pierwszego Cheryl lub Sheryl.
USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
Następujący przykład wyszukuje wiersze dla pracowników w Person tabela zawierającej nazwiska Zheng lub Zhang.
USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO
Zobacz także