In SQL Server kunt u ofwel de CHARINDEX()
functie of de PATINDEX()
functie om een string binnen een string te vinden. Dit zijn Transact-SQL-tekenreeksfuncties en ze zijn ook beschikbaar in Azure-databases.
Op het eerste gezicht lijken deze functies precies hetzelfde te doen, en in veel gevallen zou je kunnen gebruiken wat je maar wilt.
Er zijn echter een aantal verschillen die kunnen bepalen welke functie u in bepaalde scenario's wilt gebruiken. Deze kunnen als volgt worden samengevat:
PATINDEX()
kunt u jokertekens gebruiken om naar patronen te zoeken.CHARINDEX()
niet.CHARINDEX()
accepteert een derde argument waarmee u de startpositie van de zoekopdracht kunt specificeren.PATINDEX()
niet.
Meer details over deze punten hieronder.
Definitie
Laten we eerst eens kijken naar de officiële definitie of elke functie.
CHARINDEX()
- Zoekt naar één tekenuitdrukking binnen een tweede tekenuitdrukking, waarbij de beginpositie van de eerste uitdrukking wordt geretourneerd, indien gevonden.
PATINDEX()
- Retourneert de startpositie van het eerste voorkomen van een patroon in een opgegeven uitdrukking, of nullen als het patroon niet wordt gevonden, op alle geldige tekst- en tekengegevenstypen.
Syntaxis
En hier is de officiële syntaxis van elke functie.
CHARINDEX()
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
PATINDEX()
PATINDEX ( '%pattern%' , expression )
Met beide functies kunt u dus zoeken naar een tekenuitdrukking, maar de PATINDEX()
functie stelt u in staat om te zoeken naar een patroon . Dit is dus extra functionaliteit die u niet krijgt met de CHARINDEX()
functie. Met PATINDEX()
je kunt jokertekens gebruiken om een patroon op te geven om te zoeken, wat in sommige situaties erg handig kan zijn.
Echter, CHARINDEX()
accepteert drie argumenten terwijl PATINDEX()
accepteert er maar twee. De CHARINDEX()
functie accepteert een optioneel derde argument waarmee u de startpositie van de zoekopdracht kunt specificeren. Met andere woorden, de CHARINDEX()
Met deze functie kunt u alleen die overeenkomsten retourneren die na een bepaald punt in de tekenreeks voorkomen.
Voorbeelden
Hier zijn voorbeelden die de extra functionaliteit van elke functie demonstreren.
CHARINDEX()
Hier geef ik een derde argument om een positie op te geven om te beginnen met zoeken. In dit geval wordt de eerste keer dat Bob
voorkomt, overgeslagen en het zal de positie van de tweede keer teruggeven.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultaat:
17
Dus zoals gezegd, je kunt dit niet doen met PATINDEX()
omdat het die derde parameter niet accepteert.
PATINDEX()
Hier is een voorbeeld van iets dat u kunt doen met PATINDEX()
dat u niet kunt doen met CHARINDEX()
. In dit voorbeeld gebruiken we jokertekens om naar een patroon te zoeken:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Resultaat:
11
In dit geval gebruiken we de procenttekens (%
) die jokertekens zijn om aan te geven dat een willekeurig aantal tekens kan doorgaan en onze zoekreeks kan opvolgen. We gebruiken ook het onderstrepingsteken (_
) wat een wildcard is voor een enkele karakter.
Conclusie
Dus terwijl zowel CHARINDEX()
en PATINDEX()
vergelijkbare functionaliteit bieden, en in veel gevallen kan een van beide worden gebruikt in plaats van de andere, er zijn momenten waarop u de ene boven de andere moet gebruiken.
In het bijzonder zou u CHARINDEX()
. gebruiken wanneer u een startpositie binnen de te zoeken string wilt specificeren. En je zou PATINDEX()
. gebruiken wanneer u een patroon moet opgeven om naar te zoeken.