25

我有一个 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 来查找第一个空格,但是某些城市名​​称(圣路易斯、纽约等)的名称中有空格。

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

谢谢

4

5 回答 5

43

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

是的

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

PATINDEX如果找不到模式,则返回 0,否则返回1匹配开头的基础索引。

于 2012-11-14T16:14:31.367 回答
15

您可以使用 PATINDEX 函数代替 CHARINDEX,这里是文档;)

于 2012-11-14T16:25:54.380 回答
5

这是一个非常丑陋的实现,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

于 2012-11-14T16:34:11.653 回答
4

也许有点复杂,但它可以满足您的需要:

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 分以下的分数,但您可以修改它以处理任何数字。

于 2012-11-14T16:32:47.770 回答
3

我从 url 中选择 multi-didget 数字的查询(忽略没有数字的行和数字在“?”之后的行

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)
于 2014-11-18T22:46:50.153 回答