LIKE (Transact-SQL)

Werbung
31.05.12
LIKE (Transact-SQL)
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um
den Originaltext anzuzeigen.
LIKE (Transact-SQL)
SQL Server 2012
Dieser Artikel wurde noch nicht bewertet - Dieses Thema bewerten.
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. Das Verwenden der Vergleichsoperatoren für Zeichenfolgen = und != ist nicht so
flexibel wie das Verwenden von Platzhalterzeichen mit dem LIKE-Operator. Wenn eines der
Argumente kein Zeichenfolgen-Datentyp ist, wird es ggf. von SQL Server Database Engine
(Datenbankmodul) in einen Zeichenfolgen-Datentyp konvertiert.
Transact-SQL-Syntaxkonventionen
Syntax
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Argumente
match_expression
Ist ein gültiger Ausdruck eines beliebigen Zeichendatentyps.
pattern
Ist die bestimmte Zeichenfolge, nach der in match_expression gesucht werden soll, und
kann die folgenden gültigen Platzhalterzeichen enthalten. pattern kann maximal 8.000
Bytes umfassen.
Platzhalter
Beschreibung
Beispiel
%
Eine Zeichenfolge
aus null oder mehr
Zeichen
WHERE title LIKE '%Computer%' findet alle
Buchtitel, die das Wort 'Computer' enthalten.
_
Ein einzelnes
(Unterstrich) Zeichen
WHERE au_fname LIKE '_ean' findet alle Vornamen
mit vier Buchstaben, die auf ean enden (Dean,
Sean usw.).
[]
WHERE au_lname LIKE '[C-P]arsen' findet alle
Autorennachnamen, die auf 'arsen' enden und mit
einem einzelnen Zeichen zwischen C und P
beginnen, z. B. Carsen, Larsen, Karsen usw. In
Bereichssuchvorgängen unterscheiden sich die im
Bereich enthaltenen Zeichen möglicherweise je
nach den Sortierungsregeln für die Sortierung.
Beliebiges einzelnes
Zeichen im
angegebenen
Bereich ([a-f]) oder
in der angegebenen
Menge ([abcdef]).
msdn.microsoft.com/de-de/library/ms179859.aspx
1/8
31.05.12
LIKE (Transact-SQL)
[^]
Beliebiges einzelnes
Zeichen, das sich
nicht im
angegebenen
Bereich ([^a-f])
oder in der
angegebenen
Menge ([^abcdef])
befindet.
WHERE au_lname LIKE 'de[^l]%' findet alle
Autorennachnamen, die mit 'de' beginnen und deren
dritter Buchstabe nicht l ist.
escape_character
Ist ein Zeichen, das vor einem Platzhalterzeichen eingefügt wird, um anzuzeigen, dass
der Platzhalter als reguläres Zeichen und nicht als Platzhalter interpretiert werden soll.
escape_character ist ein Zeichenausdruck ohne Standard und muss zu einem einzelnen
Zeichen ausgewertet werden.
Ergebnistypen
Boolean
Ergebniswert
LIKE gibt TRUE zurück, wenn match_expression dem angegebenen pattern entspricht.
Hinweise
Bei Zeichenfolgenvergleichen mithilfe von LIKE werden alle Zeichen in der Musterzeichenfolge
berücksichtigt. Dazu gehören alle vorhergehenden oder nachfolgenden Leerzeichen. Wenn in
einer Abfrage LIKE 'abc ' (abc, gefolgt von einem Leerzeichen) verwendet wird, um Zeilen
zurückzugeben, die dem Muster abc ähnlich sind, 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 Zeilen zurückzugeben, die dem Muster abc ähnlich sind,
werden alle Zeilen zurückgegeben, die mit abc anfangen und null oder mehr nachfolgende
Leerzeichen enthalten.
Ein Zeichenfolgenvergleich mithilfe eines Musters, das Daten der Typen char und varchar
enthält, kann bei einem Vergleich mit dem LIKE-Operator aufgrund der Art der
Datenspeicherung fehlschlagen. Verschaffen Sie sich eine Übersicht darüber, wie die einzelnen
Datentypen gespeichert werden und wann ein Vergleich mit LIKE fehlschlagen kann. 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
bestimmten Zeichen beginnen.
USE AdventureWorks2012;
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
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.
msdn.microsoft.com/de-de/library/ms179859.aspx
2/8
31.05.12
LIKE (Transact-SQL)
Das folgende Beispiel ist jedoch erfolgreich, da der varchar-Variablen keine nachfolgenden
Leerzeichen hinzugefügt werden.
USE AdventureWorks2012;
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';
Dies ist das Resultset.
FirstName
LastName
City
----------
-------------------- ---------------
Angela
Barbariol
Snohomish
David
Barber
Snohomish
(2 row(s) affected)
Mustervergleich mithilfe von LIKE
LIKE unterstützt Mustervergleiche im ASCII- und Unicode-Format. Sind alle Argumente
(match_expression, pattern und ggf. escape_character) ASCII-Zeichen, wird ein ASCIIMustervergleich durchgeführt. Wenn eines der Argumente von einem Unicode-Datentyp ist,
werden alle Argumente in Unicode konvertiert und ein Unicode-Mustervergleich durchgeführt.
Wenn Sie beim LIKE-Operator Unicode-Daten (nchar- oder nvarchar-Datentypen)
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
msdn.microsoft.com/de-de/library/ms179859.aspx
3/8
31.05.12
LIKE (Transact-SQL)
Hinweis
LIKE-Vergleiche werden von der Sortierung beeinflusst. Weitere Informationen finden Sie
unter COLLATE (Transact-SQL).
Verwenden des %-Platzhalterzeichens
Wird bei LIKE beispielsweise '5%' angegeben, sucht Database Engine (Datenbankmodul) 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
AdventureWorks2012 -Datenbank angezeigt, da sie alle mit den Buchstaben dmbeginnen.
USE AdventureWorks2012;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
Wenn Objekte angezeigt werden sollen, die keine dynamischen Verwaltungssichten sind,
verwenden Sie NOT LIKE 'dm%'. Sind insgesamt 32 Objekte vorhanden und LIKE ermittelt 13
dieser Objekte, die dem Muster entsprechen, ermittelt NOT LIKE die 19 Objekte, die dem
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
dbeginnen oder deren zweiter Buchstabe mist, aus dem Resultset ebenso entfernt werden wie
die Namen der dynamischen Verwaltungssichten. Grund dafür ist die schrittweise Auswertung
von Musterzeichenfolgen mit negativen Platzhalterzeichen, d. h., dass Platzhalter für
Platzhalter ausgewertet wird. Wenn der Vergleich an einem beliebigen Punkt der Auswertung
fehlschlägt, wird das entsprechende Objekt aus dem Resultset 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 LIKESchlü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 ']'
]
msdn.microsoft.com/de-de/library/ms179859.aspx
4/8
31.05.12
LIKE (Transact-SQL)
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. In
der discounts-Tabelle der customers-Datenbank können beispielsweise Rabattwerte mit einem
Prozentzeichen (%) gespeichert werden. Um nach dem Prozentzeichen als Zeichen und nicht
als Platzhalterzeichen zu suchen, müssen das ESCAPE-Schlüsselwort und das Escapezeichen
angegeben werden. Angenommen, eine Beispieldatenbank enthält eine Spalte comment mit
dem Text "30%" enthält. Wenn Sie in den Zeilen der comment-Spalte nach der Zeichenfolge
"30%" suchen, geben Sie eine WHERE-Klausel an, z. B. WHERE comment LIKE '%30!%%'
ESCAPE '!'. Werden ESCAPE und das Escapezeichen nicht angegeben, gibt Database Engine
(Datenbankmodul) alle Zeilen zurück, die die Zeichenfolge 30 enthalten.
Wenn im LIKE-Muster kein Zeichen auf ein Escapezeichen 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 Zeichen,
das auf das Escapezeichen folgt, als reguläres Zeichen im Muster behandelt. Dazu gehören die
Platzhalterzeichen Prozent (%), Unterstrich (_) und linke Klammer ([), wenn sie in doppelte
Klammern ([ ]) eingeschlossen sind. Innerhalb doppelter Klammern ([ ]) können Escapezeichen
verwendet werden; dem Caretzeichen (^), dem Bindestrich (-) sowie der rechten Klammer (])
kann ein Escapezeichen vorangestellt werden.
0x0000 (char(0)) ist ein nicht definiertes Zeichen in Windows-Sortierungen und kann nicht in
LIKE enthalten sein.
Beispiele
A.Verwenden von NOT LIKE mit dem Platzhalterzeichen %
Im folgenden Beispiel werden alle Telefonnummern gefunden, die die Vorwahl 415in der
PersonPhone-Tabelle enthalten.
USE AdventureWorks2012;
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
Dies ist das Resultset.
FirstName
LastName
-----------------
------------------- ------------
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
msdn.microsoft.com/de-de/library/ms179859.aspx
Phone
5/8
31.05.12
LIKE (Transact-SQL)
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 PersonPhone-Tabelle gefunden, die
nicht die Vorwahl 415aufweisen.
USE AdventureWorks2012;
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
Dies ist das Resultset.
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 c1-Spalte der mytbl2-Tabelle 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
msdn.microsoft.com/de-de/library/ms179859.aspx
6/8
31.05.12
LIKE (Transact-SQL)
);
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 des []-Platzhalterzeichens
Im folgenden Beispiel werden Mitarbeiter in der Person-Tabelle mit dem Vornamen Cheryloder
Sherylgesucht.
USE AdventureWorks2012;
GO
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
Zhengoder Zhanggesucht.
USE AdventureWorks2012;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO
Siehe auch
Verweis
Ausdrücke (Transact-SQL)
Integrierte Funktionen (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
Fanden Sie dies hilfreich?
Ja
Nein
Community-Inhalt
© 2012 Microsoft. Alle Rechte vorbehalten.
msdn.microsoft.com/de-de/library/ms179859.aspx
7/8
31.05.12
msdn.microsoft.com/de-de/library/ms179859.aspx
LIKE (Transact-SQL)
8/8
Herunterladen