In SQL Server kunt u de T-SQL PATINDEX()
functie gebruiken om een patroon binnen een string te vinden. Specifiek, de functie retourneert alleen het eerste voorkomen van het patroon binnen de string.
De functie accepteert twee argumenten; het patroon en de string.
u kunt jokertekens gebruiken binnen het patroon.
syntaxis
De syntaxis gaat als volgt:
PATINDEX ( '%pattern%' , expression )
waarbij patroon een tekenexpressie is die de te vinden reeks bevat, en expressie de expressie is die moet worden doorzocht.
Voorbeeld 1 – basisgebruik
Hier is een voorbeeld van hoe het werkt:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
resultaat:
+----------+| Result ||----------|| 12 |+----------+
het percentageteken (%
) is een jokerteken dat een tekenreeks van nul vertegenwoordigt of meer personages.
Voorbeeld 2-geen overeenkomst
Dit is wat er gebeurt als we de jokertekens niet opnemen:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Uitslag:
+----------+| Result ||----------|| 0 |+----------+
Alhoewel, als je de volledige tekenreeks overeenkomt met het patroon zonder jokertekens, krijg je een match:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Resultaat:
+----------+| Result ||----------|| 1 |+----------+
Echter, je krijgt niet een wedstrijd als de string bevat meer tekens bevatten:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Uitslag:
+----------+| Result ||----------|| 0 |+----------+
In dat geval kunt u een enkele sterretje te gebruiken:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Resultaat:
+----------+| Result ||----------|| 1 |+----------+
u kunt ook een enkele Joker gebruiken ergens in het midden van het patroon:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
resultaat:
+----------+| Result ||----------|| 1 |+----------+
In dit geval hebben we een overeenkomst omdat het begin en einde van de tekenreeks overeenkomen met het begin en einde van het patroon. Natuurlijk komt het midden van de tekenreeks ook overeen met het midden van het patroon, omdat alle andere tekens worden gedekt door het percentage teken.
Voorbeeld 3 – de Underscore jokertekens
Hier is nog een voorbeeld waar we een ander jokerteken introduceren:
SELECT PATINDEX('B_er', 'Beer') AS Result;
resultaat:
+----------+| Result ||----------|| 1 |+----------+
de underscore (_
) die een joker is voor elk teken. Daarom, het zal alleen overeenkomen als er precies één teken in die positie.
natuurlijk kan het bovenstaande patroon overeenkomen met veel verschillende strings. Bijvoorbeeld:
SELECT PATINDEX('B_er', 'Beer') AS 'Beer', PATINDEX('B_er', 'Bier') AS 'Bier', PATINDEX('B_er', 'Baer') AS 'Baer', PATINDEX('B_er', 'B er') AS 'B er';
resultaat:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Voorbeeld 4 – vergelijking van de _ en % jokertekens
dit voorbeeld toont het verschil tussen de _
en %
jokertekens.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
resultaat:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
de underscore komt alleen overeen als er precies één teken in die positie staat. Om twee karakters te matchen, moeten we twee underscores gebruiken.
het percentage teken aan de andere kant, komt overeen met een willekeurig aantal tekens, inclusief nul, zoals te zien in het volgende voorbeeld:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Uitslag:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Voorbeeld 5 – Een Database Voorbeeld
Hier is een voorbeeld van het gebruik van deze functie in een database query:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Resultaat:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
In dit geval heb ik gebruik de WHERE
component om terug te keren alleen de albums die daadwerkelijk overeenkomen, samen met hun PATINDEX()
resultaat. Als ik de WHERE
clausule liet vallen, zouden alle albums zijn geretourneerd, ongeacht of ze overeenkomen of niet.
voor degenen die niet overeenkomen, zou het PATINDEX()
resultaat nul zijn.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
resultaat:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Powerslave | 0 || Powerage | 0 || Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || Casualties of Cool | 0 || Epicloud | 0 || Somewhere in Time | 0 || Piece of Mind | 0 || Killers | 0 || No Prayer for the Dying | 15 |+-------------------------+-----------------+
Voorbeeld 6 – Alleen eerste voorkomen
zoals vermeld, PATINDEX()
geeft alleen het eerste voorkomen van het patroon binnen de Tekenreeks terug.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
resultaat:
+----------+| Result ||----------|| 5 |+----------+
de CHARINDEX() functie
De T-SQL CHARINDEX()
functie is vergelijkbaar met PATINDEX()
. Er zijn echter enkele verschillen tussen de twee. In het bijzonder accepteert de PATINDEX()
jokertekens, maar geen startpositie. CHARINDEX()
accepteert daarentegen een startpositie, maar geen jokertekens.