LIKE (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Bestimmt, ob eine bestimmte Zeichenfolge mit einem angegebenen Muster übereinstimmt. Ein Muster kann normale Zeichen und Platzhalterzeichen einschließen. Bei einem Mustervergleich müssen normale Zeichen exakt mit den angegebenen Zeichen in der Zeichenfolge übereinstimmen. Platzhalterzeichen können jedoch mit beliebigen Teilen der Zeichenfolge übereinstimmen. Durch die Verwendung von Platzhalterzeichen ist der LIKE
-Operator flexibler als die Vergleichsoperatoren für Zeichenfolgen, =
und !=
. Wenn eins der Argumente kein Zeichenfolgen-Datentyp ist, wird es von SQL Server-Datenbank-Engine in einen Zeichenfolgen-Datentyp konvertiert, sofern dies möglich ist.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server und Azure SQL-Datenbank:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Syntax für Azure Synapse Analytics und Parallel Data Warehouse:
match_expression [ NOT ] LIKE pattern
ESCAPE
und STRING_ESCAPE
werden in Azure Synapse Analytics oder Analytics Platform System (PDW) nicht unterstützt.
Argumente
match_expression
Ein gültiger Ausdruck des Char-Datentyps.
pattern
Die spezifische Zeichenfolge, nach der im Vergleichsausdruck gesucht werden soll. Sie kann gültige Platzhalterzeichen aus der folgenden Tabelle enthalten. pattern darf maximal 8.000 Bytes umfassen.
Wenn match_expression ein Datentyp mit höherer Rangfolge als muster ist und die Musterlänge größer als match_expression ist, wird bei der impliziten Konvertierung des Musterwerts in match_expression Typ ein Abschneidefehler ausgegeben.
Platzhalter | BESCHREIBUNG | Beispiel |
---|---|---|
% |
Eine Zeichenfolge aus null oder mehr Zeichen | WHERE title LIKE '%computer%' findet alle Buchtitel, die an beliebiger Stelle das Wort computer enthalten. |
_ (Unterstrich) |
Ein einzelnes Zeichen. | WHERE au_fname LIKE '_ean' gibt alle aus vier Buchstaben bestehenden Vornamen zurück, die mit ean enden (z. B. Dean oder Sean ). |
[ ] |
Jedes beliebige einzelne Zeichen innerhalb des angegebenen Bereichs [a-f] oder der angegebenen Gruppe [abcdef] . |
WHERE au_lname LIKE '[C-P]arsen' findet Nachnamen von Autoren, die auf arsen enden und mit einem beliebigen einzelnen Zeichen zwischen C und P beginnen, z. B. Carsen , Larsen oder Karsen . In Bereichssuchvorgängen unterscheiden sich die im Bereich enthaltenen Zeichen möglicherweise je nach den Sortierungsregeln für die Sortierung. |
[^] |
Jedes beliebige einzelne Zeichen außerhalb des angegebenen Bereichs [^a-f] oder der angegebenen Gruppe [^abcdef] . |
WHERE au_lname LIKE 'de[^l]%' findet alle Autorennachnamen, die mit de beginnen und deren nächster Buchstabe nicht l ist. |
escape_character
Ein Zeichen, das vor einem Platzhalterzeichen eingefügt wird, um anzuzeigen, dass der Platzhalter als reguläres Zeichen und nicht als Platzhalter interpretiert wird. excape_character ist ein Zeichenausdruck ohne Standard und muss zu einem einzelnen Zeichen ausgewertet werden.
Ergebnistyp
Boolescher Wert
Ergebniswert
LIKE
gibt TRUE zurück, wenn der Vergleichsausdruck dem angegebenen Muster entspricht.
Bemerkungen
Bei Zeichenfolgenvergleichen mithilfe von LIKE
werden alle Zeichen in der Musterzeichenfolge berücksichtigt. Die zu berücksichtigenden Zeichen umfassen alle führenden oder nachfolgenden Leerzeichen. Wenn in einer Vergleichsabfrage LIKE 'abc '
(abc
, gefolgt von einem Leerzeichen) verwendet wird, um alle Zeilen mit diesem Muster zurückzugeben, werden keine Zeilen zurückgegeben, die den Wert abc
(abc
ohne Leerzeichen) enthalten. Nachfolgende Leerzeichen in dem Ausdruck, der mit dem Muster verglichen wird, werden jedoch ignoriert. Wenn in einer Abfrage LIKE 'abc'
(abc
ohne Leerzeichen) verwendet wird, um alle Zeilen mit diesem Muster zurückzugeben, werden alle Zeilen zurückgegeben, die mit abc
anfangen und keine oder mindestens ein nachfolgendes Leerzeichen enthalten.
Ein Zeichenfolgenvergleich anhand eines Musters, das Daten der Typen char und varchar enthält, ist bei Verwendung des LIKE
-Operators möglicherweise nicht erfolgreich. Dies liegt an der Art der Datenspeicherung für den jeweiligen Datentyp. Im folgenden Beispiel wird eine lokale char-Variable an eine gespeicherte Prozedur übergeben. Mit einem Mustervergleich sollen dann alle Mitarbeiter gefunden werden, deren Nachnamen mit den angegebenen Zeichen beginnen.
-- 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
Die FindEmployee
-Prozedur gibt keine Zeilen zurück, da die char-Variable (@EmpLName
) immer dann nachfolgende Leerzeichen enthält, wenn der Name weniger als 20 Zeichen enthält. Da die LastName
-Spalte vom Typ varchar ist, sind keine nachfolgenden Leerzeichen vorhanden. Diese Prozedur schlägt fehl, da die nachfolgenden Leerzeichen von Bedeutung sind.
Das folgende Beispiel ist jedoch erfolgreich, da der varchar-Variablen keine nachfolgenden Leerzeichen hinzugefügt werden.
-- 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
Hier sehen Sie das Ergebnis.
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Mustervergleich mit LIKE
LIKE
unterstützt Mustervergleiche im ASCII- und Unicode-Format. Sind alle Argumente (match_expression, pattern und ggf. escape_character) ASCII-Zeichen, wird ein ASCII-Mustervergleich durchgeführt. Wenn eines der Argumente den Unicode-Datentyp aufweist, werden alle Argumente in Unicode konvertiert, und es wird ein Unicode-Mustervergleich durchgeführt. Wenn Sie beim LIKE
-Operator Unicode-Daten (vom Datentyp nchar oder nvarchar) verwenden, werden nachfolgende Leerzeichen berücksichtigt. Bei Daten, die nicht vom Typ Unicode sind, werden nachfolgende Leerzeichen ignoriert. Der Unicode-LIKE
-Operator ist mit dem ISO-Standard kompatibel. Der ASCII-LIKE
-Operator ist mit früheren Versionen von SQL Server kompatibel.
Die folgenden Beispiele verdeutlichen die Unterschiede der zurückgegebenen Zeilen beim Durchführen von Mustervergleichen mit ASCII- und Unicode-LIKE
-Operatoren.
-- 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
Hinweis
LIKE
-Vergleiche werden von der Sortierung beeinflusst. Weitere Informationen finden Sie unter COLLATE (Transact-SQL).
Verwenden des %
-Platzhalterzeichens
Wird beispielsweise LIKE '5%'
angegeben, sucht die Datenbank-Engine nach der Zahl 5
, gefolgt von einer beliebigen Zeichenfolge mit 0 oder mehr Zeichen.
Mit der folgenden Abfrage werden beispielsweise alle dynamischen Verwaltungssichten in der AdventureWorks2022
-Datenbank angezeigt, da sie alle mit den Buchstaben dm
beginnen.
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
Wenn Objekte angezeigt werden sollen, bei denen es sich nicht um dynamische Verwaltungssichten handelt, verwenden Sie NOT LIKE 'dm%'
. Sind insgesamt 32 Objekte vorhanden und LIKE
findet 13 Namen, die dem Muster entsprechen, findet NOT LIKE
die 19 Objekte, die dem LIKE
-Muster nicht entsprechen.
Mit einem Muster wie LIKE '[^d][^m]%'
werden möglicherweise nicht immer die gleichen Namen gefunden. Statt 19 Namen werden möglicherweise nur 14 angezeigt, da Namen, die mit d
beginnen oder deren zweiter Buchstabe m
ist, aus dem Resultset ebenso entfernt werden wie die Namen der dynamischen Verwaltungssichten. Grund für dieses Verhalten ist die sequentielle Auswertung von Musterzeichenfolgen mit negativen Platzhalterzeichen, es wird also ein Platzhalter nach dem anderen ausgewertet. Wenn der Vergleich an einem beliebigen Punkt der Auswertung fehlschlägt, wird das entsprechende Objekt entfernt.
Verwenden von Platzhalterzeichen als Literale
Platzhalterzeichen können auch als Literalzeichen verwendet werden. Um ein Platzhalterzeichen als Literalzeichen zu verwenden, schließen Sie das Platzhalterzeichen in Klammern ein. Die folgende Tabelle enthält einige Beispiele für die Verwendung des LIKE
-Schlüsselworts und der [ ]
-Platzhalterzeichen.
Symbol | Bedeutung |
---|---|
LIKE '5[%]' |
5% |
LIKE '[_]n' |
_n |
LIKE '[a-cdf]' |
a , b , c , d oder f |
LIKE '[-acdf]' |
- , a , c , d oder f |
LIKE '[ [ ]' |
[ |
LIKE ']' |
] |
LIKE 'abc[_]d%' |
abc_d und abc_de |
LIKE 'abc[def]' |
abcd , abce und abcf |
Mustervergleich mit der ESCAPE-Klausel
Sie können nach Zeichenfolgen suchen, die ein oder mehrere Platzhalterzeichen enthalten. Die discounts-Tabelle in der customers-Datenbank kann beispielsweise Rabattwerte mit einem Prozentzeichen (%) speichern. Um nach dem Prozentzeichen als Zeichen und nicht als Platzhalterzeichen zu suchen, müssen das ESCAPE-Schlüsselwort und das Escapezeichen angegeben werden. Eine Beispieldatenbank enthält beispielsweise eine comment-Spalte, die den Text 30% enthält. Wenn Sie in den Zeilen der comment-Spalte nach der Zeichenfolge "30%" suchen, geben Sie eine WHERE-Klausel wie WHERE comment LIKE '%30!%%' ESCAPE '!'
an. Werden ESCAPE und das Escapezeichen nicht angegeben, gibt die Datenbank-Engine alle Zeilen zurück, die die Zeichenfolge 30!
enthalten.
Wenn im LIKE-Muster auf ein Escapezeichen kein Zeichen folgt, ist das Muster nicht gültig, und das LIKE-Muster gibt FALSE zurück. Wenn es sich beim Zeichen nach einem Escapezeichen nicht um ein Platzhalterzeichen handelt, wird das Escapezeichen verworfen und das folgende Zeichen als reguläres Zeichen im Muster behandelt. Zu diesen Platzhalterzeichen gehören das Prozentzeichen (%), der Unterstrich (_) und die linke eckige Klammer ([), wenn sie in doppelte eckige Klammern ([ ]) eingeschlossen sind. Innerhalb doppelter eckiger Klammern ([ ]) können Escapezeichen verwendet werden; dem Caretzeichen (^), dem Bindestrich (-) sowie der rechten eckigen Klammer (]) kann ein Escapezeichen vorangestellt werden.
0x0000
(char(0)) ist ein nicht definiertes Zeichen in Windows-Sortierungen und darf in LIKE nicht enthalten sein.
Beispiele
A. Verwenden von LIKE mit dem %
-Platzhalterzeichen
Im folgenden Beispiel werden alle Telefonnummern gefunden, die die Vorwahl 415
in der PersonPhone
-Tabelle enthalten.
-- 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
Hier sehen Sie das Ergebnis.
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. Verwenden von NOT LIKE mit dem %
-Platzhalterzeichen
Im folgenden Beispiel werden alle Telefonnummern in der Tabelle PersonPhone
gefunden, die nicht die Vorwahl 415
aufweisen.
-- 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
Hier sehen Sie das Ergebnis.
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. Verwenden der ESCAPE-Klausel
Im folgenden Beispiel werden die ESCAPE
-Klausel und das Escapezeichen verwendet, um die exakte Zeichenfolge 10-15%
in der Spalte c1
der Tabelle mytbl2
zu suchen.
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: Verwenden der [ ]
-Platzhalterzeichens
Im folgenden Beispiel werden Mitarbeiter in der Person
-Tabelle mit dem Vornamen Cheryl
oder Sheryl
gesucht.
-- Uses AdventureWorks
SELECT BusinessEntityID,
FirstName,
LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
Im folgenden Beispiel werden in der Person
-Tabelle Zeilen für Mitarbeiter mit den Nachnamen Zheng
oder Zhang
gesucht.
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC,
FirstName ASC;
GO
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
E. Verwenden von LIKE mit dem %
-Platzhalterzeichen
Im folgenden Beispiel werden alle Mitarbeiter in der DimEmployee
-Tabelle mit Telefonnummern gefunden, die mit 612
beginnen.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;
F. Verwenden von NOT LIKE mit dem %
-Platzhalterzeichen
Das folgende Beispiel findet alle Telefonnummern in der Tabelle DimEmployee
, die nicht mit 612
beginnen.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
G. Verwenden von LIKE mit dem _
-Platzhalterzeichen
Im folgenden Beispiel werden alle Telefonnummern in der DimEmployee
-Tabelle gefunden, die eine Vorwahl aufweisen, die mit 6
beginnt und mit 2
endet. Das Platzhalterzeichen % wird am Ende des Suchmusters eingefügt, um alle folgenden Zeichen im Spaltenwert für Telefonnummern abzugleichen.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;