2012-11-14 40 views
15

我有一個VARCHAR數據(50)的SQL Server列如下:在SQL Server中,你能找到字符串中的第一個數字嗎?

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

我試圖解析出數據,所以我有這樣的事情:

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

我卡住。我打算使用charindex找到第一個空間,但是一些城市名稱(聖路易斯,紐約等)在名稱中有空格。

有沒有辦法確定第一個數字在字符串中的位置?

感謝

+1

使用PATINDEX代替CHARINDEX => http://msdn.microsoft.com/library/ms188395.aspx – fnurglewitz

+0

謝謝tr3。你爲什麼不發表一個答案,所以我可以給你一個upvode。 – codingguy3000

+0

確定:)謝謝 – fnurglewitz

回答

11

可以使用PATINDEX函數而不是CHARINDEX,here所在的文件;)

28

有沒有一種方法,以確定在 字符串的第一個數字的位置?

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

PATINDEX返回0,如果該圖案無法找到或比賽的開始否則1基於索引。

+0

我想到了正則表達式 - 但這可能只是Oracle ..不確定。 – Randy

+0

@Randy - 它們可以在SQL Server中使用,但需要先安裝CLR函數。沒有開箱即用的支持, –

3

也許有點複雜,但它爲你所需要的:

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 

上面的查詢工作的成績下100分,但你可以修改它來處理任何數字。

+0

這幾乎是完美的。我只是刪除了「。」從模式。因此[0-9.-]更改爲[0-9-]。有用。非常感謝David! – codingguy3000

3

這裏是一個非常難看的實施PATINDEX()返回的多個列中的數據:

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 

SQL Fiddle with Demo

2

我的選擇多didget號碼的開出一個URL(忽略行,而不查詢數目和行,其中的數量是後的「?」

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

您可以添加您的查詢的輸入和輸出字符串的例子嗎? –

相關問題