在SQL Server中,您可以找到字符串中的第一个数字吗?

时间:2012-11-14 16:12:00

标签: sql-server string

我有一个varchar(50)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找到第一个空间,但是一些城市名称(圣路易斯,纽约等)的名字中有空格。

有没有办法识别字符串中第一个数字的位置?

由于

5 个答案:

答案 0 :(得分:35)

  

有没有办法识别a中第一个数字的位置?   字符串?

SELECT PATINDEX('%[0-9]%','Washington 40 New Orleans 32')
如果无法找到模式,则

PATINDEX返回0,否则返回基于1的匹配开头索引。

答案 1 :(得分:11)

您可以使用PATINDEX函数代替CHARINDEX,here位于文档中;)

答案 2 :(得分:4)

这是一个非常难看的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

答案 3 :(得分: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分的分数,但您可以对其进行修改以处理任何数字。

答案 4 :(得分:2)

我从网址中选择多位数字的查询(忽略没有数字的行和数字在'?'之后的行

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)