I SQL Server kan du använda T-SQL CHARINDEX()
funktion eller PATINDEX()
funktion för att hitta en sträng i en annan sträng. Här är en snabb översikt över varje funktion.
CHARINDEX()-funktionen
Denna funktion accepterar 3 argument; strängen att hitta, strängen för att söka och en valfri startposition.
CHARINDEX()
syntax går så här:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Där expressionToFind är uttrycket du vill hitta i den andra strängen och expressionToSearch är den andra strängen. Den valfria startplats kan användas för att ange en position inom expressionToSearch som du ska börja söka efter.
Observera att endast positionen för den första förekomsten returneras.
Exempel
Här är ett exempel:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Resultat:
1
I det här exemplet är det första argumentet Bob
, vilket betyder att vi söker efter det andra argumentet efter Bob
. Resultatet är 1 eftersom det är positionen där Bob
visas först i det andra argumentet.
Du kanske också märker att Bob
visas faktiskt två gånger i strängen, men endast positionen för den första matchningen returneras.
Ingen match
Om det andra argumentet inte innehöll Bob
resultatet skulle ha blivit 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Resultat:
0
Ange en startposition
Du kan ange en startposition för var du ska börja söka. Detta innebär att SQL Server hoppar över alla händelser som kommer före den startpositionen. Resultaten rapporteras dock fortfarande baserat på dess position inom strängen (inte från startpositionen).
Om detta låter förvirrande bör följande exempel hjälpa:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultat:
17
Så i det här exemplet börjar vi söka på position 16 (vilket råkar vara utrymmet före den andra Bob
). Resultatet är att den första förekomsten av Bob
hoppas över och den andras position återställs. Och vi kan se att dess position är 17 tecken från början av strängen (även om det bara är ett tecken från där vi började söka).
Skiftlägeskänslighet
Du kan uttryckligen utföra en skiftlägeskänslig sökning genom att lägga till COLLATE-satsen i din SELECT-sats:
skiftlägeskänslig
Här är en skiftlägeskänslig sökning:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Resultat:
0
Detta är skiftlägeskänsligt eftersom _CS
står för Case-Sensitive.
skiftlägeskänslig
Och här är en sökning som inte är skiftlägeskänslig:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Resultat:
11
Detta är skiftlägeskänsligt eftersom _CI
står för Case-Insensitive.
PATINDEX()-funktionen
PATINDEX()
funktion gör ett liknande jobb som CHARINDEX()
. Du har i princip ett val av vilken du vill använda. Den största skillnaden ligger i syntaxen.
PATINDEX()
funktions syntax ser ut så här:
PATINDEX ( '%pattern%' , expression )
Där mönster är ett teckenuttryck som innehåller sekvensen som ska hittas och uttryck är uttrycket som ska sökas (vanligtvis en kolumn).
PATINDEX()
accepterar jokertecken, men inte en startposition. CHARINDEX()
accepterar å andra sidan en startposition, men inte jokertecken.
Exempel
Här är ett exempel:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Resultat:
12
Men här är vad som händer när vi inte inkluderar jokertecken:
SELECT PATINDEX('eer', 'Bob likes beer.');
Resultat:
0
Här är ett annat exempel där vi introducerar ett annat jokertecken:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Resultat:
11
I det här fallet, understrecket (_
) som är ett jokertecken för ett enskilt tecken.