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

Откуда:
Сообщений: 59
Подскажите как лучше выбрать только те строки по полю в котором встречаются последовательности чисел длиной до 20 символов.
И нужно выбрать сами эти последовательности.

with a as (select 'aaaaaaa 123 dsd 01.01.2001 asdd 12345678901234567890' s union all
		   select 'abc 02.02.2002 asdd #1234567890' union all
		   select 'qaz 03.04.2005 09876543210987654321 zxcvbn 098 ')

select * from a


Спасибо.
4 мар 15, 16:26    [17343054]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
b00ring,

последовательность чисел или цифр?
4 мар 15, 16:29    [17343072]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

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

цифр конечно.
4 мар 15, 16:31    [17343085]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Выбрать строки совсем просто
WHERE s NOT LIKE '%'+REPLICATE('[0123456789']',21)+'%'
Осталась ерунда - выделить последовательность из s.
Вопрос: а если таких последовательностей много?
4 мар 15, 16:36    [17343109]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Выбрать строки совсем просто
WHERE s NOT LIKE '%'+REPLICATE('[0123456789]',21)+'%'

Осталась ерунда - выделить последовательность из s.
Вопрос: а если таких последовательностей много?
Поправка:
WHERE s LIKE '%'+REPLICATE('[0123456789]',20)+'%'
AND s NOT LIKE '%'+REPLICATE('[0123456789]',21)+'%'
4 мар 15, 16:37    [17343120]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Поправка:
WHERE s LIKE '%'+REPLICATE('[0123456789]',20)+'%'
AND s NOT LIKE '%'+REPLICATE('[0123456789]',21)+'%'
Вот что значит торопиться!
WHERE s LIKE '%[0123456789]%'
AND s NOT LIKE '%'+REPLICATE('[0123456789]',21)+'%'
4 мар 15, 16:39    [17343124]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

Откуда:
Сообщений: 59
iap
Выбрать строки совсем просто
WHERE s NOT LIKE '%'+REPLICATE('[0123456789']',21)+'%'
Осталась ерунда - выделить последовательность из s.
Вопрос: а если таких последовательностей много?


Много быть не должно. Из условия задачи она должна быть одна.
4 мар 15, 17:11    [17343294]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
b00ring
iap
Выбрать строки совсем просто
WHERE s NOT LIKE '%'+REPLICATE('[0123456789']',21)+'%'

Осталась ерунда - выделить последовательность из s.
Вопрос: а если таких последовательностей много?


Много быть не должно. Из условия задачи она должна быть одна.
В Ваших примерах их много. Очень много!
4 мар 15, 17:12    [17343297]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
b00ring
пропущено...


Много быть не должно. Из условия задачи она должна быть одна.
В Ваших примерах их много. Очень много!
Может, Вы имели в виду не числа, а цифры
и не "до 20 символов", а "больше 20 символов"?
4 мар 15, 17:14    [17343311]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

Откуда:
Сообщений: 59
Наверное неправильно выразился, в результате моего примера должны быть выбраны значения:
s
12345678901234567890
09876543210987654321


То есть последовательности цифр длиной 20 символов
4 мар 15, 17:20    [17343345]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

Откуда:
Сообщений: 59
условие выбирает такие строки, осталось выбрать сами последовательности.

s LIKE '%'+REPLICATE('[0-9]',20)+'%'
4 мар 15, 17:23    [17343358]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
тынц

К сообщению приложен файл. Размер - 14Kb
4 мар 15, 17:26    [17343372]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
b00ring
Наверное неправильно выразился, в результате моего примера должны быть выбраны значения:
s
12345678901234567890
09876543210987654321


То есть последовательности цифр длиной 20 символов


К сообщению приложен файл. Размер - 15Kb
4 мар 15, 17:30    [17343395]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
QWERTY!
Guest
select x.s from (
				select 'aaaaaaa 123 dsd 01.01.2001 asdd 12345678901234567890' s union all
				select 'abc 02.02.2002 asdd #1234567890' union all
				select 'qaz 03.04.2005 09876543210987654321 zxcvbn 098 ') as x
where charindex('12345678901234567890',x.s,0) > 0 or charindex('09876543210987654321',x.s,0) > 0
4 мар 15, 17:33    [17343413]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
churupaha,

/*

если возможны такие кренделя:

aaaaaaa 123 dsd 01.01.2001 asdd 12345678901234567890
aaaaaaa 123 dsd 01.01.2001 asdd12345678901234567890defefefefefe


*/

то так

ext.Regex_Matches(s, '(?<=(?:[^\d]|\b))\d{20}(?=(?:[^\d]|\b))', null);
4 мар 15, 17:36    [17343440]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

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

а что за структура ext.Regex_Matches?
4 мар 15, 17:47    [17343478]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

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

Сорри ссылку проглядел.
4 мар 15, 17:47    [17343481]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
b00ring
churupaha,

а что за структура ext.Regex_Matches?


ext.Regex_Matches
4 мар 15, 17:48    [17343485]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
b00ring
Member

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

/*

если возможны такие кренделя:

aaaaaaa 123 dsd 01.01.2001 asdd 12345678901234567890
aaaaaaa 123 dsd 01.01.2001 asdd12345678901234567890defefefefefe


*/

то так

ext.Regex_Matches(s, '(?<=(?:[^\d]|\b))\d{20}(?=(?:[^\d]|\b))', null);



Спасибо, отлично работает, единственное надо включить поддержку CLR на уровне сервера.
4 мар 15, 17:57    [17343518]     Ответить | Цитировать Сообщить модератору
 Re: выбрать строки с последовательностью чисел длиной N  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
b00ring
Спасибо, отлично работает, единственное надо включить поддержку CLR на уровне сервера.


не за что.

надо сказать, на чистом sql у меня такой вырвиглазный код получился, что его даже стыдно сюда постить... неговоря уже о том, чтобы реально использовать.
4 мар 15, 21:28    [17344198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить