Site Overlay

met behulp van SQL Server’ s CHARINDEX en PATINDEX

Als u veel applicaties hebt geschreven, hebt u waarschijnlijk situaties meegemaakt waarin u moet identificeren of een specifiek teken of een reeks tekens in een tekenreeks voorkomt. In dit artikel zal ik het gebruik van de functies CHARINDEX en PATINDEX bespreken om tekstkolommen en tekenreeksen te zoeken. Ik zal je laten zien hoe elk van deze functies werkt, en de verschillen tussen hen uitleggen., Gaf ook enkele voorbeelden over hoe je zou kunnen overwegen om deze functies te gebruiken om een aantal verschillende karakterzoeksituaties op te lossen.

De CHARINDEX-en Patindex-functies worden gebruikt om een tekenreeks te zoeken naar een teken of een reeks tekens. Als de tekenreeks waarnaar wordt gezocht de tekens bevat waarnaar wordt gezocht, dan retourneren deze functies een niet-nul integer waarde. Deze integerwaarde is de startlocatie van waar de tekenreeks waarnaar wordt gezocht zich bevindt binnen de tekenreeks die wordt doorzocht., De Patindex functie maakt het mogelijk om jokertekens syntaxis te gebruiken in het patroon waarnaar wordt gezocht, terwijl de CHARINDEX functie jokertekens niet ondersteunt. Laten we eens kijken naar elk van deze functies in een beetje meer detail.

Hoe gebruik je de Charindex-functie

De CHARINDEX-functie draait de beginpositie van een teken, of een tekenreeks met een andere tekenreeks., De CHARINDEX-functie wordt aangeroepen met de volgende opmaak:

CHARINDEX (expression1, expression2)

waarbij expression1 de tekenreeks is die in expression2 te vinden is, en start_locationis de positie waar de CHARINDEX-functie naar expression1 gaat zoeken in expression2.

De functie CHARINDEX draait een geheel getal om. De waarde van het geheel getal die wordt geretourneerd is de positie waar de tekens waarnaar wordt gezocht zich bevinden in de string die wordt doorzocht. Als de CHARINDEX niet de tekens vindt waarnaar u zoekt, retourneert thefunction een nul integer waarde., Laten we zeggen dat we de volgende charindex functie aanroep uitvoeren:

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

Deze functie aanroep geeft de startlocatie van de tekenreeks “SQL” terug, in de string “MicrosoftSQL Server”. In dit geval geeft de CHARINDEX functie het nummer 11 terug,wat zoals je kunt zien de startpositie van “S” is in de string “Microsoft SQLServer”.

stel nu dat we het volgende CHARINDEX Commando hebben:

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

In dit voorbeeld geeft de functie carindex nul terug, omdat de tekenreeks “7.0” niet kan worden gevonden in de string “Microsoft SQL Server 2000”., Laat gaan door middel van een paar voorbeelden van hoe je in staat zou zijn om de CHARINDEX functie te gebruiken om een aantal daadwerkelijke T-SQL problemen op te lossen.

voor het eerste voorbeeld zeg dat u alleen de achternaam van de kolom contactnaam wilt weergeven, voor de eerste 5 records in de klantentabel van de Northwind database. Hier zijn de eerste 5records.

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

zoals u kunt zien, bevat de gebruikersnaam zowel de voor-als achternaam van de klant, waarbij de voor-en achternaam worden gescheiden door een enkele spatie. Ik zal de CHARINDEX functie gebruiken om de positie van de ruimte tussen de twee namen te identificeren., Op deze manier kunnen we de positie van de ruimte gebruiken om de contactnaam te ontleden, zodat we alleen het laatste gedeelte van de kolom kunnen weergeven. Hier is een aantal T-SQL code om alleen de laatste naam weer te geven voor de eerste 5 records in de Northwind klant tabel.

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

Hier is de uitvoer van dit commando:

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

De CHARINDEX-functie vond de ruimte tussen de voor-en achternaam, zodat de substring-functie de contactnaam kon splitsen, zodat alleen de achternaam werd weergegeven., Ik heb 1 toegevoegd aan de integerwaarde die CHARINDEX retourneerde, dus de weergegeven achternaam begon niet met een spatie.

voor het tweede voorbeeld, stel dat u alle records uit een tabel wilt tellen waar een bepaalde kolom een specifieke tekenreeks bevat. De CHARINDEX-functie kan worden gebruikt om aan uw verzoek te voldoen. Om alle adressen in Northwind te tellen.dbo.Customertable waar de Adreskolom het woord ‘Road’ of een abbreviation voor road (‘Rd’) bevat, ziet uw SELECT statement er als volgt uit:

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

Hoe werkt de PATINDEX-functie?,

De functie PATINDEX keert de beginpositie van een teken of Tekenreeks terug in een andere tekenreeks of expressie. Zoals eerder vermeld de PATINDEX heeft extra functionaliteit dan CHARINDEX. PATINDEX ondersteunt jokertekens inde search pattern string. Dit maakt PATINDEX waardevol voor het zoeken naarvarying string Patronen. Het PATINDEX Commando neemt de volgende vorm aan:

PATINDEX( ‘%pattern%’ , expression )

waarbij “pattern” de tekenreeks is waarnaar u zoekt en expressie de tekenreeks is waarin u zoekt., Gewoonlijk is de uitdrukking een kolom in atable. Het ” % ” teken is nodig op de voor-en achterkant van het patroon, tenzij u zoekt naar het patroon aan het begin en/of einde van de expressie.

net als de CHARINDEX functie,geeft de PATINDEX functie de beginpositie van het patroon binnen de string die wordt gezocht. Als u een PATINDEX functie aanroep als zo:

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

dan is het resultaat van de patindex functie aanroep 2, Wat hetzelfde is als de CHARINDEX functie., De % ’s in het bovenstaande commando vertelt het PATINDEX commando om de positie van de”BC” tekenreeks te vinden waar de tekenreeks nul of meer tekens kan hebben voor, ofafter “BC”. Het % teken is een jokerteken.

Als u wilt bepalen of een tekenreeks begint met een specifieke set tekens, laat u het eerste% teken weg, en uw PATINDEX aanroep ziet er als volgt uit:

PATINDEX(‘AB%’,’ABCD’)

In dit geval geeft de Patindexfunctie een 1 terug, wat aangeeft dat het patroon ‘AB’ werd gevonden in de expressie ‘ABCD’.,

nu met jokertekens kunt u een veel ingewikkelder pattern matching situatie maken dan de simpleones die ik u tot nu toe heb getoond. Stel dat u wilt bepalen of een tekenstring de letters A en Z bevat, evenals een numeriek getal. Dan kan uwpatindex functie aanroep er zo uitzien.

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

merk op dat het patroon waarnaar ik zoek in het bovenstaande voorbeeld een aantal jokertekens gebruikt. ReviewSQL Server Books Online voor andere wildcard syntaxis informatie., Laten we gaan door middel van een paar voorbeelden in hoe we het PATINDEX commando zou kunnen gebruiken in conjunctionwith een SELECT statement.

zeg dat u alle records wilt vinden die de woorden “Bread” of “bread” bevatten in de Description textcolumn in the Northwind.dbo.Categories table, dan zou je SELECT statement er als volgt uitzien:

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

Hier heb ik jokertekens gebruikt voor een kleine of hoofdletter “b”., Als ik dit SELECT statement start tegen mijn Northwind database krijg ik de volgende Beschrijvingskolommen te zien:

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

Hier is een ander voorbeeld waar ik wat extra jokertekens heb gebruikt om records te vinden. Dit voorbeeld sluit de beschrijving uit die een ‘e’heeft als de tweede letter van het resultaat in het bovenstaande voorbeeld.

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

door een additionalPATINDEX functie aanroep toe te voegen aan het where statement, dat het ^ wildcardsymbool gebruikte, kon ik de beschrijving”Dessert, snoepjes en zoete broodjes” uitsluiten., Het bovenstaande voorbeeld gaf de volgende enkele beschrijving.

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

conclusie

zoals u kunt zien voeren de Charindex en de PATINDEX soortgelijke soorten patroonzoekopdrachten uit binnen een tekenreeks. De PATINDEX functie biedt jokertekens specificaties, waardoor het kan worden gebruikt voor veel verschillende soorten patroon wedstrijden, terwijl de Charindex functie niet. Afhankelijk van wat je moet doen, zijn deze twee functies geweldig in het helpen van u zoeken, manipuleren en ontleden tekenreeksen in SQLServer.

” bekijk alle artikelen van columnist Gregory A. Larsen

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *