我有一个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找到第一个空间,但是一些城市名称(圣路易斯,纽约等)的名字中有空格。
有没有办法识别字符串中第一个数字的位置?
由于
答案 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
答案 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)