I SQL Server kan du bruge enten CHARINDEX()
funktionen eller PATINDEX()
funktion til at finde en streng i en streng. Disse er Transact-SQL-strengfunktioner, og de er også tilgængelige på Azure-databaser.
På overfladen ser disse funktioner ud til at gøre nøjagtig det samme, og i mange tilfælde kan du bruge det, du foretrækker at bruge.
Der er dog et par forskelle, der kan diktere, hvilken funktion du vælger at bruge i visse scenarier. Disse kan opsummeres ved følgende:
PATINDEX()
giver dig mulighed for at bruge jokertegn til at søge efter mønstre.CHARINDEX()
ikke.CHARINDEX()
accepterer et tredje argument, som giver dig mulighed for at angive startpositionen for søgningen.PATINDEX()
ikke.
Flere detaljer om disse punkter nedenfor.
Definition
Lad os først se på den officielle definition eller hver funktion.
CHARINDEX()
- Søger efter ét tegnudtryk inde i et andet tegnudtryk og returnerer startpositionen for det første udtryk, hvis det findes.
PATINDEX()
- Returnerer startpositionen for den første forekomst af et mønster i et specificeret udtryk, eller nuller, hvis mønsteret ikke findes, på alle gyldige tekst- og tegndatatyper.
Syntaks
Og her er den officielle syntaks for hver funktion.
CHARINDEX()
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
PATINDEX()
PATINDEX ( '%pattern%' , expression )
Så begge funktioner giver dig mulighed for at søge efter et tegnudtryk, dog PATINDEX()
funktionen giver dig mulighed for at søge efter et mønster . Så dette er ekstra funktionalitet, som du ikke får med CHARINDEX()
fungere. Med PATINDEX()
du kan bruge jokertegn til at angive et mønster, der skal søges i, hvilket kan være meget praktisk i nogle situationer.
Dog CHARINDEX()
accepterer tre argumenter, mens PATINDEX()
accepterer kun to. CHARINDEX()
funktion accepterer et valgfrit tredje argument, der giver dig mulighed for at angive startpositionen for søgningen. Med andre ord, CHARINDEX()
funktionen giver dig mulighed for kun at returnere de matches, der opstår efter et bestemt punkt i strengen.
Eksempler
Her er eksempler, der viser den ekstra funktionalitet, som hver funktion giver.
CHARINDEX()
Her giver jeg et tredje argument for at angive en position til at begynde at søge. I dette tilfælde vil den springe den første forekomst af Bob
over og det vil returnere positionen for den anden forekomst.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultat:
17
Så som nævnt kan du ikke gøre dette med PATINDEX()
fordi den ikke accepterer den tredje parameter.
PATINDEX()
Her er et eksempel på noget, du kan gøre med PATINDEX()
som du ikke kan gøre med CHARINDEX()
. I dette eksempel bruger vi jokertegn til at søge efter et mønster:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Resultat:
11
I dette tilfælde bruger vi procenttegnene (%
), som er jokertegn for at angive, at et vilkårligt antal tegn kunne fortsætte og lykkes med vores søgestreng. Vi bruger også understregningen (_
), som er et jokertegn for enhver enkelt tegn.
Konklusion
Så mens både CHARINDEX()
og PATINDEX()
leverer lignende funktionalitet, og i mange tilfælde kan den ene bruges i stedet for den anden. Der er tidspunkter, hvor du bliver nødt til at bruge den ene frem for den anden.
Specifikt skal du bruge CHARINDEX()
når du vil angive en startposition i strengen for at søge. Og du ville bruge PATINDEX()
hver gang du skal angive et mønster at søge efter.