25

次のようなデータを含むvarchar(50)SQLServer列があります。

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

CHARINDEXの代わりにPATINDEX関数を使用できます。ここにドキュメントがあります;)

于 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 FiddlewithDemoを参照してください

于 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からマルチディジェット番号を選択するためのクエリ(番号のない行と、番号が「?」の後にある行は無視してください)

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 に答える