2012-11-14 5 views
15

Ich habe eine varchar (50) SQL Server-Spalte mit Daten wie folgt aus:In SQL Server können Sie die erste Zahl in einer Zeichenfolge finden?

RawData 
---------------------------- 
Washington 40 New Orleans 32 
Detroit 27 St. Louis 23 

Ich versuche, um die Daten zu analysieren, so dass ich so etwas wie dieses:

WinningTeam  WinningTeamScore  LosingTeam LosingTeamScore 
-----------  ----------------  ---------- --------------- 
Washington  40     New Orleans 32 
Detroit   27     St. Louis  23 

Ich bin stecken. Ich wollte Charindex verwenden, um den ersten Platz zu finden, allerdings haben einige Stadtnamen (St. Louis, New York usw.) Leerzeichen in den Namen.

Gibt es eine Möglichkeit, die Position der ersten Zahl in einer Zeichenfolge zu identifizieren?

Dank

+1

Verwendung PATINDEX statt CHARINDEX => http://msdn.microsoft.com/library/ms188395.aspx – fnurglewitz

+0

Danke tr3. Warum postest du keine Antwort, damit ich dir einen upvode geben kann. – codingguy3000

+0

ok :) danke – fnurglewitz

Antwort

11

Sie können die PATINDEX Funktion anstelle von CHARINDEX, here liegt in der Dokumentation;)

28

Gibt es eine Möglichkeit, die Position der ersten Zahl in einem Zeichenfolge zu identifizieren?

Ja

SELECT PATINDEX('%[0-9]%','Washington 40 New Orleans 32') 

PATINDEX 0 zurück, wenn das Muster nicht oder 1 basierter Index des Beginns des Spiels sonst zu finden ist.

+0

Ich dachte an reguläre Ausdrücke - aber das kann Oracle nur .. nicht sicher sein. – Randy

+0

@Randy - Sie können in SQL Server verwendet werden, müssen jedoch zuerst eine CLR-Funktion installieren. Kein Standard-Support, –

3

Vielleicht ein wenig kompliziert, aber es funktioniert für das, was Sie brauchen:

declare @test table(mytext varchar(50)) 

insert @test values('Washington 40 New Orleans 32') 
insert @test values('Detroit 27 St. Louis 23') 

select 
WinningTeam=SubString(mytext, 0,PatIndex('%[0-9.-]%', mytext)), 
WinningTeamScore=Left(SubString(mytext, PatIndex('%[0-9.-]%', mytext), 50),PatIndex('%[^0-9.-]%', SubString(mytext, PatIndex('%[0-9.-]%', mytext), 50) + 'X')-1), 
LosingTeam=SubString(mytext, PatIndex('%[0-9.-]%', mytext)+3,PatIndex('%[0-9.-]%', mytext)), 
LosingTeamScore=reverse(Left(SubString(reverse(mytext), PatIndex('%[0-9.-]%', reverse(mytext)), 50),PatIndex('%[^0-9.-]%', SubString(reverse(mytext), PatIndex('%[0-9.-]%', reverse(mytext)), 50) + 'X')-1)) 
from @test 

Die Abfrage oben für Partituren arbeitet unter 100 Punkte, aber Sie können es ändern, um mit irgendeiner Zahl umzugehen.

+0

Das ist fast perfekt. Ich musste nur das "." aus dem Muster. Also wurde [0-9.-] zu [0-9-] geändert. Es klappt. Vielen Dank David !!! – codingguy3000

3

Hier ist eine sehr hässliche Implementierung von PATINDEX(), die die Daten in den mehreren Spalten zurückgibt:

SELECT rtrim(substring(RawData, 1, PATINDEX('%[0-9]%', RawData) -1)) WinningTeam, 
    ltrim(rtrim(substring(RawData, PATINDEX('%[0-9]%', RawData), 2))) WinningTeamScore, 
    reverse(ltrim(rtrim(substring(reverse(SUBSTRING(RawData, 1, LEN(rawdata) - (PATINDEX('%[aA-zZ]%', REVERSE(rawData)) - PATINDEX('%[0-9]%', reverse(RawData))))), 1, PATINDEX('%[0-9]%', SUBSTRING(RawData, 1, LEN(rawdata) - (PATINDEX('%[aA-zZ]%', REVERSE(rawData)) - PATINDEX('%[0-9]%', reverse(RawData))))))))) LosingTeam, 
    substring(reverse(RawData), PATINDEX('%[0-9]%', reverse(RawData)), (PATINDEX('%[aA-zZ]%', REVERSE(rawData)) - PATINDEX('%[0-9]%', reverse(RawData)))) LosingTeamScore 
from yourtable 

Siehe SQL Fiddle with Demo

2

meine Abfrage für die Zeilen aus einer URL mit mehreren didget Zahlen Auswählen (ignorieren, ohne eine Zahl und Zeilen, in denen die Zahl hinter dem ist ‚?‘

select 
    URL, 
    substring(URL,PATINDEX ('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',URL),7) as id 
from data 
where 
    PATINDEX ('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',URL)>0 
and PATINDEX ('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',URL)<charindex ('?',URL) 
+0

Können Sie bitte ein Beispiel für Eingabe- und Ausgabezeichenfolgen Ihrer Abfrage hinzufügen? –

Verwandte Themen