sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man hittar en sträng i en sträng i SQL Server

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.


  1. Python-import MySQLdb-fel - Mac 10.6

  2. SQL DELETE för nybörjare

  3. Vad är det förväntade beteendet för flera set-returnerande funktioner i SELECT-satsen?

  4. Observer Overhead- och väntetypssymptom