In SQL Server kunt u de T-SQL PATINDEX()
. gebruiken functie om een patroon binnen een string te vinden. In het bijzonder retourneert de functie alleen de eerste voorkomen van het patroon binnen de string.
De functie accepteert twee argumenten; het patroon en de string.
U kunt binnen het patroon jokertekens gebruiken.
Syntaxis
De syntaxis gaat als volgt:
PATINDEX ( '%pattern%' , expression )
Waar patroon is een tekenuitdrukking die de te vinden reeks bevat, en uitdrukking is de uitdrukking waarnaar moet worden gezocht.
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld van hoe het werkt:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Resultaat:
+----------+ | Result | |----------| | 12 | +----------+
Het procentteken (%
) is een jokerteken dat een reeks van nul of meer tekens vertegenwoordigt.
Voorbeeld 2 – Geen overeenkomst
Dit is wat er gebeurt als we de jokertekens niet opnemen:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Resultaat:
+----------+ | Result | |----------| | 0 | +----------+
Hoewel, als de volledige tekenreeks overeenkomt met het patroon zonder jokertekens, je een overeenkomst krijgt:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Resultaat:
+----------+ | Result | |----------| | 1 | +----------+
U krijgt echter geen overeenkomst als de tekenreeks meer tekens bevat:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Resultaat:
+----------+ | Result | |----------| | 0 | +----------+
In dat geval zou u een enkel jokerteken kunnen gebruiken:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Resultaat:
+----------+ | Result | |----------| | 1 | +----------+
Je zou ook een enkele joker ergens in het midden van het patroon kunnen gebruiken:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Resultaat:
+----------+ | Result | |----------| | 1 | +----------+
In dit geval kregen we een match omdat het begin en einde van de string overeenkwam met het begin en einde van het patroon. Natuurlijk kwam het midden van de tekenreeks ook overeen met het midden van het patroon, omdat alle andere tekens worden gedekt door het procentteken.
Voorbeeld 3 – Het underscore-jokerteken
Hier is nog een voorbeeld waarin we een ander jokerteken introduceren:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Resultaat:
+----------+ | Result | |----------| | 1 | +----------+
Het onderstrepingsteken (_
) wat een jokerteken is voor elk afzonderlijk teken. Daarom komt het alleen overeen als er precies één teken op die positie staat.
Natuurlijk kan het bovenstaande patroon overeenkomen met veel verschillende snaren. 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 demonstreert 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 | +-----+-----+------+
Het onderstrepingsteken komt alleen overeen als er precies één teken op die positie staat. Om twee tekens te matchen, moeten we twee onderstrepingstekens gebruiken.
Het procentteken daarentegen komt overeen met een willekeurig aantal tekens, inclusief nul, zoals te zien is in het volgende voorbeeld:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Resultaat:
+-----+-----+------+ | % | _ | __ | |-----+-----+------| | 1 | 0 | 0 | +-----+-----+------+
Voorbeeld 5 – Een databasevoorbeeld
Hier is een voorbeeld van het gebruik van deze functie in een databasequery:
USE Music; SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index' FROM Albums WHERE 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 gebruik ik de WHERE
clausule om alleen die albums terug te geven die daadwerkelijk overeenkomen, samen met hun PATINDEX()
resultaat. Als ik de WHERE
. laat vallen clausule, zouden alle albums zijn geretourneerd, ongeacht of ze overeenkwamen of niet.
Voor degenen die niet overeenkwamen, de PATINDEX()
resultaat zou 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 keer
Zoals vermeld, PATINDEX()
geeft alleen de eerste . terug voorkomen van het patroon binnen de string.
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 de PATINDEX()
accepteert jokertekens, maar geen startpositie. CHARINDEX()
aan de andere kant accepteert een startpositie, maar geen jokertekens.