
Имеем сроку, начинающуюся с целого числа, вида 112-ОМГ, желаем вырезать из нее числовую часть. На stackoverflow приводится следующий код
declare @str varchar(50)
set @str = '112-ОМГ '
select left(@str, patindex('%[^0-9]%', @str + '.') - 1)
select patindex('%[^0-9]%', @str) -- для иллюстрации работы patindex
Небольшое пояснение к механике его работы. Функция left вырезает левую часть строки с заданным количеством симоволов.
Функция pathindex находит начальную позицию для заданного шаблона, нумерация начинается с 1. Согласно описанию шаблонов в MS SQL шаблон вида %[^0-9]% описывает любую строку, не имеющую в своем составе символов 0-9 (дополнительно про символ ^ в шаблонах t-sql).
Для строки 112-ОМГ patindex вернет 4 и соответственно left вырежет не только числовую часть, но и первый символ нечисловой, значит это значение надо уменьшить на 1.
Зачем нужно прибавление точки к строке? В случае пустой строки patindex вернет 0, который является недопустимым значением для left, так что мы просто гарантируем минимальную длину строки в 1 символ
Если числовую часть надо отконвертировать в int можно использовать например такую функцию
create
function dbo.int_from_str (@str varchar(500))
returns int as
begin
declare @int as int
set @int = 0
set @str = ltrim(rtrim(@str))
set @str = left(@str, patindex('%[^0-9]%', @str + '.') - 1)
if @str is not null and @str <> ''
begin set @int = cast(@str as int) end
return @int
end
view source
print
?
select dbo.IntFromStr ('0Ч/Д')
select dbo.IntFromStr ('84 ')
select dbo.IntFromStr ('4.')
select dbo.IntFromStr ('')
select dbo.IntFromStr (null)
select dbo.IntFromStr ('ч/д')
select dbo.IntFromStr (' 385-F')
