2012-11-14 16 views
15

Mam varchar kolumna serwer (50) SQL z danymi tak:W SQL Server można znaleźć pierwszą liczbę w ciągu znaków?

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

Staram się analizować dane, więc mam coś takiego:

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

jestem oblepiony. Zamierzałem użyć charindexu, aby znaleźć pierwsze miejsce, jednak niektóre nazwy miast (St. Louis, New York, itp.) Mają spacje w nazwach.

Czy istnieje sposób na określenie pozycji pierwszej liczby w ciągu znaków?

Dzięki

+1

użycie PATINDEX zamiast CHARINDEX => http://msdn.microsoft.com/library/ms188395.aspx – fnurglewitz

+0

Dzięki tr3. Dlaczego nie zamieścisz odpowiedzi, więc dam ci upstream. – codingguy3000

+0

ok :) dziękuję – fnurglewitz

Odpowiedz

11

Można użyć funkcji PATINDEX zamiast CHARINDEX, here leży dokumentacją;)

28

Czy istnieje sposób, aby określić położenie pierwszego numeru w ciąg?

Tak

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

PATINDEX zwraca 0, jeśli nie można znaleźć wzór lub na podstawie indeksu początku meczu inaczej 1.

+0

myślałem o wyrażeń regularnych - ale to może być tylko Oracle .. nie jestem pewien. – Randy

+0

@Randy - Mogą być używane w SQL Server, ale musisz najpierw zainstalować funkcję CLR. Brak wsparcia z pudełka, –

3

Może trochę skomplikowane, ale działa to, czego potrzebujesz:

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 

Zapytanie powyżej działa na ocenę pod 100 punktów, ale możesz go zmodyfikować, aby poradzić sobie z dowolnym numerem.

+0

To jest prawie idealne. Po prostu musiałem usunąć "." ze wzoru. Więc [0-9.-] zostało zmienione na [0-9-]. To działa. Wielkie dzięki David! – codingguy3000

3

Tutaj jest bardzo brzydki realizacja PATINDEX() która zwraca dane w wielu kolumnach:

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 

Zobacz SQL Fiddle with Demo

2

moje zapytanie do wybierania numerów multi-didget z url (ignorować wierszy bez liczba i wiersze, w których liczba jest po „?”

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

Czy możesz dodać przykład ciągów wejściowych i wyjściowych zapytania? –

Powiązane problemy