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

Откуда:
Сообщений: 812
Доброго дня уважаемы форумчане. Как мне вытащить число из заданной строки? Допустим есть строка "4.20.2.6.1. Реабилитация травматологических больных (21дн.)" Мне нужно из нее получить чисто число 21 без скобок и прочего.

Делаю так, но получаю число начало строки число 4.

	DECLARE @s nvarchar(255);
	SET @s = ' 4.20.2.6.1.  Реабилитация травматологических больных  (21дн.)'
	-- берем переднюю часть строки, начиная с числа
	SELECT @s = SUBSTRING(@s, PATINDEX('%[0-9]%', @s),LEN(@s));
	-- отсекаем хвост до числа
	SELECT @s = SUBSTRING(@s, 0, PATINDEX('%[^0-9]%',@s));
	-- выводим
	SELECT @s;
5 июл 12, 13:57    [12822086]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Glory
Member

Откуда:
Сообщений: 104760
А 4, 20, 2, 6, 1 - это разве не числа ? Чем они хуже 21 ?
5 июл 12, 14:00    [12822097]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

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

Мне конкретно надо то что в скобках. Остальное не надо.
5 июл 12, 14:03    [12822128]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Glory
Member

Откуда:
Сообщений: 104760
НадеждаМ
Мне конкретно надо то что в скобках

Ну так вот и надо наверное сначала вытащить то, что скобках ?
5 июл 12, 14:04    [12822138]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
И желательно скобки тоже отсечь оставив только 21. Может я шаблон не правильно задаю в patindex....
5 июл 12, 14:05    [12822146]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
НадеждаМ,

Скобка находится CHARINDEXом.
5 июл 12, 14:06    [12822160]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
НадеждаМ
И желательно скобки тоже отсечь оставив только 21. Может я шаблон не правильно задаю в patindex....
Если искать именно круглые скобки, то удобнее charindex, а не patindex
5 июл 12, 14:08    [12822177]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Спасибо сейчас попробую charindex.
5 июл 12, 14:09    [12822190]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
НадеждаМ,

кстати, можете словами описать точный алгоритм нахождения скобок?
Ведь пока не факт, что в строке нет других скобок
5 июл 12, 14:09    [12822199]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Glory
Member

Откуда:
Сообщений: 104760
НадеждаМ
Может я шаблон не правильно задаю в patindex....

Шаблон ищет _первое_ число в строке.
5 июл 12, 14:12    [12822223]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
iap, Вы конечно правы, но пока у мен не встерчается записей с другими скобками в строке. Хотя может быть лучше искать не по скобкам а по сокращению "дн." или "дней ".
5 июл 12, 14:17    [12822265]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
НадеждаМ
iap, Вы конечно правы, но пока у мен не встерчается записей с другими скобками в строке. Хотя может быть лучше искать не по скобкам а по сокращению "дн." или "дней ".
Ну дык надо сначала определиться.
5 июл 12, 14:22    [12822310]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Буду определять по "дн." или "дней".
5 июл 12, 14:29    [12822384]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
НадеждаМ
Буду определять по "дн." или "дней".
Это не точный алгоритм
5 июл 12, 14:31    [12822417]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Да ясно что не точный, но чтож делать если в оной строке так (21дн.), а в другой (15 дней)...
5 июл 12, 14:36    [12822461]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Glory
Member

Откуда:
Сообщений: 104760
НадеждаМ
Да ясно что не точный, но чтож делать если в оной строке так (21дн.), а в другой (15 дней)...

Переделать программа так, чтобы пользователь вводил число дней в отдельное, числовое поле
5 июл 12, 14:44    [12822533]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Glory, пользователь ничего никуда не вводит. Значения берутся из справочника и просто просматирваются на форме. Просто надо количество дней отделить от наименования и вывести в запросе на просмотр в отдельный столбец.
5 июл 12, 14:49    [12822576]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Glory
Member

Откуда:
Сообщений: 104760
НадеждаМ
Glory, пользователь ничего никуда не вводит. Значения берутся из справочника

А в справочнике они божьим промыслом появлись наверное ?


НадеждаМ
Просто надо количество дней отделить от наименования и вывести в запросе на просмотр в отдельный столбец.

Ну вот определите точные критерии поиска и реализуйте их.
5 июл 12, 14:51    [12822594]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

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

Справочники нам присылают, затем они закачиваются в базу в таком виде в каком прислали. Пользователи их только смотрят и редактировать не могут.
5 июл 12, 14:54    [12822634]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
_ч_
Member

Откуда:
Сообщений: 1427
НадеждаМ,

Ну, если число дней в вашей строке всегда последнее из чисел, тогда можно так:

	

SELECT @s = SUBSTRING(REVERSE(@s), PATINDEX('%[0-9]%', REVERSE(@s)),LEN(@s));
-- отсекаем хвост до числа
SELECT @s = SUBSTRING(@s, 0, PATINDEX('%[^0-9]%',@s));
-- выводим
SELECT REVERSE(@s);
5 июл 12, 15:03    [12822711]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
_ч_, Спасибо за совет, попробую.
5 июл 12, 15:09    [12822765]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
НадеждаМ,

собрала вот что-то. Не уверена на все 100% что это правильно.

	DECLARE @s nvarchar(255);
	SET @s = ' 4.20.2.6.1.  Реабилитация травматологических больных  (21дн.)'

	SELECT @s = SUBSTRING(@s, PATINDEX('%[а-я]%',@s),LEN(@s));
	SELECT @s = SUBSTRING(@s, PATINDEX('%[0-9]%',@s),len(@s));
	SELECT @s = SUBSTRING(@s, 0, PATINDEX('%[а-я]%',@s));

	SELECT @s;
5 июл 12, 15:26    [12822916]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
DECLARE @s nvarchar(255)=N' 4.20.2.6.1.  Реабилитация травматологических больных  (21 дн.)';

SELECT LEFT(s,NULLIF(PATINDEX(N'%[^0-9]%',s),1))
FROM (SELECT STUFF(@s,1,1+LEN(@s)-CHARINDEX(N'(',REVERSE(@s),CHARINDEX(N')',REVERSE(@s))),N''))S(s);
5 июл 12, 16:37    [12823505]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

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

Попробовала. если между 21и "дн." нет пробела, то получается в итоге "21д".
5 июл 12, 16:52    [12823623]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
DECLARE @s nvarchar(255) = N' 4.20.2.6.1. Реабилитация травматологических больных (21дн.)'

SELECT SUBSTRING(@s, sk.s + 1, PATINDEX(N'%[^0-9]%', RIGHT(@s, LEN(@s) - sk.s)) - 1)
FROM(SELECT PATINDEX(N'%(%)%', @s)) sk(s)
5 июл 12, 16:55    [12823641]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
invm
Member

Откуда: Москва
Сообщений: 9436
DECLARE @s nvarchar(255);
SET @s = ' 4.20.2.6.1.  Реабилитация травматологических больных  (21дн.)';

with cte(s) as
(
 select
  right(@s, len(@s) - nullif(patindex('%([0-9]%)', @s), 0))
)
select
 substring(s, 1, patindex('%[^0-9]%', s) - 1)
from
 cte;
5 июл 12, 16:56    [12823646]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Спасибо всем за советы и примеры. Завтра попробую ваши варианты.
5 июл 12, 17:01    [12823672]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
НадеждаМ
iap,

Попробовала. если между 21и "дн." нет пробела, то получается в итоге "21д".
DECLARE @s nvarchar(255)=N' 4.20.2.6.1.  Реабилитация травматологических больных  (21 дн.)';

SELECT LEFT(s,NULLIF(PATINDEX(N'%[^0-9]%',s)-1,0))
FROM (SELECT STUFF(@s,1,1+LEN(@s)-CHARINDEX(N'(',REVERSE(@s),CHARINDEX(N')',REVERSE(@s))),N''))S(s);
5 июл 12, 17:07    [12823719]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
iap
НадеждаМ
iap,

Попробовала. если между 21и "дн." нет пробела, то получается в итоге "21д".
DECLARE @s nvarchar(255)=N' 4.20.2.6.1.  Реабилитация травматологических больных  (21 дн.)';

SELECT LEFT(s,NULLIF(PATINDEX(N'%[^0-9]%',s)-1,0))
FROM (SELECT STUFF(@s,1,1+LEN(@s)-CHARINDEX(N'(',REVERSE(@s),CHARINDEX(N')',REVERSE(@s))),N''))S(s);
Выбирается самое первое число в самых последних круглых скобках
5 июл 12, 17:09    [12823735]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL вытащить из строки число  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
iap
Выбирается самое первое число в самых последних круглых скобках
Только вот между левой скобкой и числом ничего не должно быть.
Плохо.
5 июл 12, 17:12    [12823742]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить