В SQL Server вы можете найти первое число в строке?

У меня есть столбец сервера varchar (50) sql с такими данными:

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, здесь лежит документация;)

Ответ 2

Есть ли способ идентифицировать положение первого числа в строка?

Да

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

PATINDEX возвращает 0, если шаблон не найден или индекс 1 на основе начала матча в противном случае.

Ответ 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

Вот очень уродливая реализация 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

Ответ 5

мой запрос для выбора чисел с несколькими номерами из 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)