Site Overlay

använda SQL Server CHARINDEX och PATINDEX

om du har skrivit många ansökningar har du förmodligen kört över situationer där du måste identifiera om ett visst tecken eller en uppsättning tecken visas i en sträng. Iden här artikeln kommer jag att diskutera med hjälp av CHARINDEX-och PATINDEX-funktionerna tosearch textkolumner och teckensträngar. Jag ska visa dig hur var och en av dessa funktioner fungerar och förklara skillnaderna mellan dem., Det gav också några exempel på hur du kan överväga att använda dessa funktioner för att lösa ett antal olika teckensökningssituationer.

Charindex-och Patindexfunktionerna används för att söka i en teckensträng för ett tecken eller en uppsättning characters. Om teckensträngen som söks innehåller teckenensöks efter, returnerar dessa funktioner ett icke-noll heltal. Thisinteger värde är startplatsen för där teckensträngen beingsearched För ligger i strängen som söks., Patindexfunktionen möjliggör användning av jokerteckensyntax i mönstret som söks efter, medan CHARINDEX-funktionen inte stöder jokerteckensökningar. Låt oss titta på var och en av dessa funktioner i lite mer detalj.

hur du använder funktionen CHARINDEXFunction

funktionen CHARINDEX återger startpositionen för ett tecken eller en sträng av tecken med en annan teckensträng., Den CHARINDEX funktion kallas använda den followingformat:

CHARINDEX( expression1 , expression2 )

Där expression1 den sträng av tecken som finns i expression2, och start_locationis den position där CHARINDEX funktion kommer att börja leta efter expression1in expression2.

funktionen CHARINDEX återger ett heltal. Heltalsvärdet som returneras är den position där dekaraktärer som söker efter finns i strängen som söks. Om CHARINDEX inte hittar de tecken du söker efter returnerar funktionen ett nolltalvärde., Låt säga att vi utför följande funktionssamtal:

CHARINDEX('SQL', 'Microsoft SQL Server')

det här funktionssamtalet kommer att returnerastartplatsen för teckensträngen ”SQL”, i strängen ”MicrosoftSQL Server”. I det här fallet kommer CHARINDEX-funktionen att returnera nummer 11, vilket som du kan se är startpositionen för ”S” i sträng ”Microsoft SQLServer”.

Säg nu att vi har följande CHARINDEX-kommando:

CHARINDEX('7.0', 'Microsoft SQL Server 2000')

i det här exemplet kommer funktionen charindex att returnera noll, eftersom teckensträngen ”7.0” inte kan hittas i strängen ”Microsoft SQL Server 2000”., Låt gå igenom ett parexempel på hur du kanske kan använda CHARINDEX-funktionen för att lösa någrafaktuella T-SQL-problem.

För det första exemplet säger du att du bara vill visa efternamnet för kolumnen ContactName, för de första 5 posterna i Kundtabellen Northwind-databasen. Här är de första 5rekord.

ContactName------------------------------ Maria AndersAna TrujilloAntonio MorenoThomas HardyChristina Berglund

som du kan se innehåller CustomerNamecontains både kundens för-och efternamn, där för-och efternamn separeras med ett enda utrymme. Jag kommer att använda CHARINDEX-funktionen för attidentifiera positionen för utrymmet mellan de två namnen., På så sätt kan vi användarymdens position för att tolka kontaktnamnet så att vi bara kan visa den sista namndelen av kolumnen. Här är några T-SQL-kod för att visa endast detsista namnet för de första 5 posterna i Northwind Kundtabellen.

select top 5 substring(ContactName, charindex(' ',ContactName)+1 , len(ContactName)) as from Northwind.dbo.customers

här är utmatningen från dettakommandot:

Last Name------------------------------ AndersTrujilloMorenoHardyBerglund

CHARINDEX-funktionen hittade utrymmet mellan för-och efternamn, så att substringsfunktionen kunde visa kontaktnamnet, alltså bara efternamnet visades., Jag lade till 1 till theinteger-värdet som CHARINDEX returnerade, så det efternamn som visas startade inte med ett mellanslag.

För det andra exemplet vill sayyou räkna alla poster från en tabell där en given kolumn innehåller en separat teckensträng. CHARINDEX-funktionen kan användas för att tillfredsställadin begäran. Att räkna alla adresser i Northwind.dbo.Customertable där Adressen kolumnen innehåller antingen ordet ” Väg ” eller anabbreviation för väg (’A’), SELECT skulle se ut så här:

select count(*) from Northwind.dbo.Customers where CHARINDEX('Rd',Address) > 0 or CHARINDEX('Road',Address)> 1

Hur Fungerar PATINDEX FunctionWork?,

PATINDEX-funktionen återger startpositionen för ett tecken eller en teckensträng med en annan sträng eller ett uttryck. Som tidigare nämnts har PATINDEX ytterligare funktionalitet över CHARINDEX. PATINDEX stöder jokertecken isökmönstersträngen. Detta gör PATINDEX värdefullt för att söka eftervarierande Strängmönster. PATINDEX-kommandot tar följande form:

PATINDEX( ’%pattern%’, expression)

där ”pattern” ärden teckensträng du söker efter och uttrycket är strängen som du söker efter., Vanligtvis är uttrycket en kolumn i atable. Tecknet ” % ” behövs på framsidan och baksidan av mönstret, om du inte söker efter mönstret i början och/eller slutet av uttrycket.

som CHARINDEX-funktionen returnerar PATINDEX-funktionen startpositionen för mönstret inom den sökta strängen. Om du har ett patindex-funktionssamtal som så:

PATINDEX(’%BC%’,’ABCD’)

då är resultatet av patindex-funktionssamtalet 2, vilket är detsamma som CHARINDEX-funktionen., %’S i ovanstående kommando berättar PATINDEX kommandot för att hitta positionen för” BC ”strängen där strängen kan ha noll eller fler tecken framför, orafter ”BC”. Tecknet % är ett jokertecken.

om du vill bestämma ifa-strängen börjar med en viss uppsättning tecken skulle du lämna det första% – tecknet, och ditt PATINDEX-samtal skulle se ut så här:

PATINDEX(’AB%’,’ABCD’)

i det här fallet returnerar Patindexfunktionen en 1, vilket indikerar att mönstret ’AB’ hittades iexpressionen ’ABCD’.,

nu med jokertecken kan du skapa en mycket mer komplicerad mönstermatchningssituation då de simpleones jag har visat dig hittills. Säg att du vill bestämma om ett teckenstränginnehåller bokstäverna A och Z, liksom alla numeriska nummer. Då kan ditt patindex-funktionssamtal se ut så här.

PATINDEX(’%%%%’,’XYZABC123′)

Observera att mönstret jag söker efter i exemplet ovan använder ett antal jokerreferenser. ReviewSQL Server Books Online för andra jokertecken syntax information., Låt oss gå igenom ett par exempel på hur vi kan använda PATINDEX-kommandot i konjunktionmed ett utvalt uttalande.

säg att du vill hitta alla poster som innehåller orden ”bröd” eller ”bröd” i beskrivningen textcolumn i Northwind.dbo.Kategorier tabell, då ditt valda uttalande skulleser ut så här:

select Description from Northwind.dbo.Categories where patindex('%read%',description) > 0

här använde jag wildcarding tolook för antingen ett lägre eller övre fall ”b”., När jag kör den här SELECT-satsen motmy Northwind-databasen får jag följande beskrivningskolumner som visas:

Description--------------------------------------------------------Desserts, candies, and sweet breadsBreads, crackers, pasta, and cereal

Här är ett annat exempeldär jag använde några ytterligare jokertecken för att hitta några poster. Detta exempel utesluter den beskrivning som har ett ” e ” som den andra bokstaven från det resultat som anges i exemplet ovan.

select Description from Northwind.dbo.Categories where patindex('%read%',description) > 0 and patindex('_%',description) = 1

genom att lägga till ett additionalPATINDEX-funktionssamtal, till where-uttalandet, som använde ^ wildcardsymbol, kunde jag utesluta”efterrätt, godis och sött bröd” – beskrivningen., Ovanstående exempel returnerade följande enda beskrivning.

Description--------------------------------------------------------Breads, crackers, pasta, and cereal 

slutsats

som du kan se Charindexoch PATINDEX utföra liknande typer av mönster sökningar inom en teckensträng. PATINDEX-funktionen ger jokerspecifikationer, så att den kan användas för mycket olika typer av mönstermatcher, medan Charindexfunktionen inte gör det. Beroende på vad du behöver göra är dessa två funktionerstor för att hjälpa dig att söka, manipulera och tolka teckensträngar i SQLServer.

”Se alla artiklar av kolumnist Gregory A. Larsen

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *