Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
okwell5
Member

Откуда:
Сообщений: 116
Есть таблица со строковыми полями Value и Num_Val(пустое). Необходимо из строки Value извлечь первое попавшееся число и скопировать в Num_Val. Задача усложняется еще тем, что впереди есть символы, типа ± или -.
Символ ± я заменю на -, это можно.
update Table1 set Num_Val = Replace(Value, '±', '-')

Все, теперь осталось извлечь первое попавшееся число(не цифру, а именно число), сохранив знак '-'.
Как это сделать, пока идей нет.
Прикрепил таблицу, какой должен быть результат в поле Num_Val.

К сообщению приложен файл (ЗначСвойств.xls - 42Kb) cкачать
9 сен 13, 15:58    [14814890]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
o-o
Guest
а может ли это число оказаться после каких-то еще символов, кроме "плюс_минус"
или есть гарантия, что если строка начинается не с "плюс_минус"-а или цифры/точки,
то ничего "выцеплять" не нужно?
(потому как если есть такая гарантия, то достаточно найти позицию первого символа,
к-ый НЕ "плюс_минус" или цифра/точка, и взять подстроку до этой позиции)
9 сен 13, 16:17    [14815023]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
okwell5
извлечь первое попавшееся число(не цифру, а именно число), сохранив знак '-'.

Дайте определению вашему понятию "число".
1,003.35 - это число ? А 1.5E02 ?
9 сен 13, 16:18    [14815025]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
o-o
(потому как если есть такая гарантия, то достаточно найти позицию первого символа,
к-ый НЕ "плюс_минус" или цифра/точка, и взять подстроку до этой позиции)

А если строка будет выглядеть как ".1.+2.3.4.5 тест"?
9 сен 13, 16:25    [14815058]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
zxc1257
Member

Откуда:
Сообщений: 71
okwell5,

на брейнфаке. числа только целые со знаком

declare @str varchar(1000)= 'fwefgt-5778efe+89w';

select cast(substring(substring(@str, patindex('%[-+0-9]%', @str), 1000), 1, patindex('%[^-+0-9]%', substring(@str, patindex('%[-+0-9]%', @str), 1000)) - 1) as int);
9 сен 13, 16:28    [14815075]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
Sp999
Member

Откуда: Пермь
Сообщений: 1669
update t
   set Num_Val = convert(money, case
                                   when patindex('%[^0-9-.]%', replace([VALUE], '±', '-')) > 0
                                   then left(replace([VALUE], '±', '-'), patindex('%[^0-9-.]%', replace([VALUE], '±', '-'))-1)
                                   else replace([VALUE], '±', '-')
                                end)
  from Table1 t
 where isnumeric(case
                    when patindex('%[^0-9-.]%', replace([VALUE], '±', '-')) > 0
                    then left(replace([VALUE], '±', '-'), patindex('%[^0-9-.]%', replace([VALUE], '±', '-'))-1)
                    else replace([VALUE], '±', '-')
                 end) = 1
 
9 сен 13, 16:42    [14815156]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
o-o
Guest
Гость333
o-o
(потому как если есть такая гарантия, то достаточно найти позицию первого символа,
к-ый НЕ "плюс_минус" или цифра/точка, и взять подстроку до этой позиции)

А если строка будет выглядеть как ".1.+2.3.4.5 тест"?


я из эго эксельного примера исхожу.
там такого нет, я же пытаюсь максимально себе жизнь облегчить
короче, для примера из аттача вот такое сойдет:

declare @t table(c nvarchar(100))
insert into @t (c)
values (N'0.126" L x 0.063" W (3.20mm x 1.60mm)'),
       (N'-55°C ~ 125°C'),
       (N'Safety')

select case PATINDEX('%[^0-9.-]%', c) 
            when 1 then null 
            else cast(SUBSTRING( c, 1, PATINDEX('%[^0-9.-]%', c) - 1) as decimal(10,3))
       end     
from @t
9 сен 13, 17:04    [14815325]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Если данные из Excel, то нужно проверять какой разделитель целой и дробной части установлен в Windows (например есть вероятность, что "," вместо "."). Иначе можно не отличить дробные.
10 сен 13, 09:16    [14817773]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
zxc1257
okwell5,
на брейнфаке. числа только целые со знаком
[/src]


в примере множество примерно таких строк 0.126" L x 0.063" W (3.20mm x 1.60mm)

формат 1.5E02 тоже может доставить проблем.

Поэтому идеальный вариант - сначала провести операцию вычленения первого числового значения в самом Excel
10 сен 13, 09:21    [14817790]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
okwell5
Member

Откуда:
Сообщений: 116
Sp999
update t
   set Num_Val = convert(money, case
                                   when patindex('%[^0-9-.]%', replace([VALUE], '±', '-')) > 0
                                   then left(replace([VALUE], '±', '-'), patindex('%[^0-9-.]%', replace([VALUE], '±', '-'))-1)
                                   else replace([VALUE], '±', '-')
                                end)
  from Table1 t
 where isnumeric(case
                    when patindex('%[^0-9-.]%', replace([VALUE], '±', '-')) > 0
                    then left(replace([VALUE], '±', '-'), patindex('%[^0-9-.]%', replace([VALUE], '±', '-'))-1)
                    else replace([VALUE], '±', '-')
                 end) = 1
 


Ваш метод сработал, результат точь в точь, как в поле Num_Val! Смотрю, используются регулярные выражения, круто! И быстро! Спасибо!
10 сен 13, 12:18    [14819083]     Ответить | Цитировать Сообщить модератору
 Re: Как извлечь первое попавшееся числовое значение из начальных символов строки  [new]
okwell5
Member

Откуда:
Сообщений: 116
okwell5,
О-О, Glory, zxc1257, СПАСИБО, что откликнулись!
10 сен 13, 13:10    [14819567]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить