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

Откуда:
Сообщений: 106
Хелп плиз

Необходимо вырезать все числа которые после себя будут иметь признак в виде последовательности '-j'. Допустим число такое будет максимум одно в каждой записи. В строке могут встречаться просто числа, их нужно игнорить.

Фидлер http://sqlfiddle.com/#!6/b4cc4d/1

Т.е. есть такое

CREATE TABLE [dbo].[Test111](
[Name] [varchar](200)
)

INSERT INTO Test111 (Name)
VALUES
('4-j aaa bbb 5'),
('555'),
('bbb 252345-j'),
('2 bbbb 2545-j aaa'),
('333-j aaa');

На выходе должно быть такое

4
252345
2545
333

Казалось что PATINDEX нам поможет, а ннет, в нем нельзя для [0-9] указывать допустимое число вхождений :(
30 апр 15, 12:31    [17586405]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
Кролик-зануда
Guest
_Vetal_,
чонть вроде
select reverse(left(x.x,isnull(nullif(patindex('%[^0-9]%',x.x),0)
                              ,len(x.x))))
  from Test111 
 cross apply(select stuff(reverse(name),1,patindex('%j-%',reverse(name))+1,''))x(x)
 where 
 Name like '%-j%'
30 апр 15, 12:42    [17586478]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
_Vetal_
Member

Откуда:
Сообщений: 106
Кролик-зануда
_Vetal_,
чонть вроде
select reverse(left(x.x,isnull(nullif(patindex('%[^0-9]%',x.x),0)
                              ,len(x.x))))
  from Test111 
 cross apply(select stuff(reverse(name),1,patindex('%j-%',reverse(name))+1,''))x(x)
 where 
 Name like '%-j%'

Брр..офигеть, так сразу и не поймешь..но похоже работает)
Спасибо!
30 апр 15, 12:56    [17586598]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
o-o
Guest
та же идея, только аккуратнее:
declare @t table([Name] [varchar](200))

INSERT INTO @t (Name)
VALUES
('4-j aaa bbb 5'),
('555'),
('bbb 252345-j'),
('2 bbbb 2545-j aaa'),
('333-j aaa'),
('-j'),
('aaa bbb-j');

with cte as(
select *, left(name,case charindex('-j', name, 1)
                         when 0 then 0
                         else charindex('-j', name, 1) - 1
                    end) as s, charindex('-j', name, 1) as ch
from @t
)

,cte1 as (
select *, ltrim(reverse(left(reverse(s),
                          case charindex(' ', reverse(s), 1)
                               when 0 then LEN(s)
                               else charindex(' ', reverse(s), 1)
                          end))) as s1   
from cte)

select Name, s1
from cte1
where s1 like '[0-9]%'


--Кролик-зануда 
select name, reverse(left(x.x,isnull(nullif(patindex('%[^0-9]%',x.x),0)
                              ,len(x.x))))
  from @t 
 cross apply(select stuff(reverse(name),1,patindex('%j-%',reverse(name))+1,''))x(x)
 where 
 Name like '%-j%'
--
-- spaces in str2,3 , wrong result in str5,6
30 апр 15, 13:07    [17586683]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
Кролик-зануда
Guest
o-o,

не такой уж я и зануда, оказывается :o)

wrong result достигнут за счет того, что предикат взят со ссылки
его недолго поправить до Name like '%[0-9]-j%'

ну и причесать, естественно, есть что в моем наброске :)
30 апр 15, 13:14    [17586729]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
o-o
Guest
Кролик-зануда,

пока мое занудство пересекалось с посторонним отвлекательством,
смотрю, ваш ответ готов.
не вникая, вывешиваю свое с кратким комментом в вашу сторону, и все, пропадаю,
меня привлекли, и кажись, до вечера,
пусть сам допиливает
30 апр 15, 13:18    [17586766]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7870
_Vetal_, это задача не для сиквела, т.к. вы нарушаете первейшую заповедь реляционных данных об атомарности.

Все, что не атомарно, не подлежит обработке SQL запросами.
30 апр 15, 13:22    [17586797]     Ответить | Цитировать Сообщить модератору
 Re: Хитро вырезать числа  [new]
_Vetal_
Member

Откуда:
Сообщений: 106
Владислав Колосов
_Vetal_, это задача не для сиквела, т.к. вы нарушаете первейшую заповедь реляционных данных об атомарности.

Все, что не атомарно, не подлежит обработке SQL запросами.

А передать 200 000 записей вместо 200 и уже их переколбашивать...это никакую заповедь случайно не нарушает? :)
30 апр 15, 14:47    [17587441]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить