I SQL Server kan du bruge T-SQL CHARINDEX()
funktionen eller PATINDEX()
funktion til at finde en streng i en anden streng. Her er et hurtigt overblik over hver funktion.
CHARINDEX()-funktionen
Denne funktion accepterer 3 argumenter; strengen for at finde, strengen for at søge og en valgfri startposition.
CHARINDEX()
syntaks ser sådan ud:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Hvor expressionToFind er det udtryk, du vil finde i den anden streng, og expressionToSearch er den anden streng. Den valgfri start_placering kan bruges til at angive en position i expressionToSearch som du skal begynde at søge efter.
Bemærk, at kun positionen for den første forekomst returneres.
Eksempel
Her er et eksempel:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Resultat:
1
I dette eksempel er det første argument Bob
, hvilket betyder, at vi søger efter det andet argument for Bob
. Resultatet er 1, fordi det er den position, hvor Bob
vises først i det andet argument.
Du bemærker måske også, at Bob
vises faktisk to gange i strengen, men kun positionen for det første match returneres.
Ingen match
Hvis det andet argument ikke indeholdt Bob
resultatet ville have været 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Resultat:
0
Specificering af en startposition
Du kan angive en startposition for, hvor du skal begynde at søge. Dette betyder, at SQL Server vil springe enhver forekomst, der kommer før den startposition, over. Resultaterne rapporteres dog stadig baseret på dens position i strengen (ikke fra startpositionen).
Hvis dette lyder forvirrende, bør følgende eksempel hjælpe:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultat:
17
Så i dette eksempel begynder vi at søge på position 16 (som tilfældigvis er mellemrummet før den 2. Bob
). Resultatet er, at den første forekomst af Bob
springes over, og den andens position returneres. Og vi kan se, at dens position er 17 tegn fra begyndelsen af strengen (selvom det kun er ét tegn, hvorfra vi begyndte at søge).
Skabsfølsomhed
Du kan eksplicit udføre en søgning, der skelner mellem store og små bogstaver, ved at tilføje COLLATE-sætningen til din SELECT-sætning:
Stilling af store og små bogstaver
Her er en søgning, der skelner mellem store og små bogstaver:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Resultat:
0
Dette skelner mellem store og små bogstaver, fordi _CS
står for Case-Sensitive.
Uafhængig af store og små bogstaver
Og her er en søgning uden store og små bogstaver:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Resultat:
11
Dette skelner mellem store og små bogstaver, fordi _CI
står for Case-Insensitive.
PATINDEX()-funktionen
PATINDEX()
funktion udfører et lignende job som CHARINDEX()
. Du har som udgangspunkt et valg om, hvilken du vil bruge. Den største forskel ligger i syntaksen.
PATINDEX()
funktions syntaks ser sådan ud:
PATINDEX ( '%pattern%' , expression )
Hvor mønster er et tegnudtryk, der indeholder den sekvens, der skal findes, og udtryk er det udtryk, der skal søges i (typisk en kolonne).
PATINDEX()
accepterer jokertegn, men ikke en startposition. CHARINDEX()
på den anden side accepterer en startposition, men ikke jokertegn.
Eksempler
Her er et eksempel:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Resultat:
12
Men her er, hvad der sker, når vi ikke inkluderer jokertegnene:
SELECT PATINDEX('eer', 'Bob likes beer.');
Resultat:
0
Her er et andet eksempel, hvor vi introducerer et andet jokertegn:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Resultat:
11
I dette tilfælde er understregningen (_
), som er et jokertegn for ethvert enkelt tegn.