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

Откуда: Израиль. Хадера.
Сообщений: 198
Можно ли использовать регулярные выражения в CharIndex()? Или для этого подходит только PatIndex()

Дело в том, что мне надо разрезать длинный стринг на несколько мелких по цифрам 1. 2. 3. и тд. 11. 12. 13.
Например:
'1. Раздел первый 2. Раздел второй 3. Вася идет на войну. 4. Вася возвращается с войны'.
Проблема в том, что нумерация может быть как однозначное число и точка, а может быть и двузначным числом с точкой.
Как составить регулярное выражение для поиска этих чисел с точками?

Спасибо!
Евгений Боуден
12 дек 11, 18:29    [11752044]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
Glory
Member

Откуда:
Сообщений: 104751
evgenybe
Можно ли использовать регулярные выражения в CharIndex()? Или для этого подходит только PatIndex()

Регулярных выражений нет ни в одной из этих функций
12 дек 11, 18:36    [11752131]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Glory
evgenybe
Можно ли использовать регулярные выражения в CharIndex()? Или для этого подходит только PatIndex()

Регулярных выражений нет ни в одной из этих функций

Может я неправильно сформулировал. Вот в PatIndex я же могу использовать что-то вот такого типа PatIndex('%[1-9].%', MyField)
Проблема в том, что это вылавливает только однозначные номера с точкой. А как написать универсально и для двузначных и для однозначных номеров и точки?
Вот если бы и в CharIndex это было бы возможно - был бы полный кайф, потому что там можнопотом передвигаться по стрингу, отталкиваясь от найденной стартовой позиции.
12 дек 11, 22:24    [11753298]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
Что за мания такая... Нельзя чтоль на клиенте парсить... и вставлять куда нужно...? TSQL Regular Expression Workbench ну или CLR процедурку настругайте...
12 дек 11, 22:34    [11753337]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
Glory
Member

Откуда:
Сообщений: 104751
evgenybe
Может я неправильно сформулировал. Вот в PatIndex я же могу использовать что-то вот такого типа PatIndex('%[1-9].%', MyField)
Проблема в том, что это вылавливает только однозначные номера с точкой.

Неправда. Нет такой проблемы

declare @x table(f1 varchar(100))

insert @x values('some string')
insert @x values('first 1. example')
insert @x values('second 2. example')
insert @x values('other 13. example')

select * from @x where PatIndex('%[1-9].%', f1) > 0
12 дек 11, 23:05    [11753526]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Glory
evgenybe
Может я неправильно сформулировал. Вот в PatIndex я же могу использовать что-то вот такого типа PatIndex('%[1-9].%', MyField)
Проблема в том, что это вылавливает только однозначные номера с точкой.

Неправда. Нет такой проблемы

declare @x table(f1 varchar(100))

insert @x values('some string')
insert @x values('first 1. example')
insert @x values('second 2. example')
insert @x values('other 13. example')

select * from @x where PatIndex('%[1-9].%', f1) > 0


Зададим
два стринга
@str1 = 'ABCDEKLMN 3. example 1'
@str2 = 'ABCDEKLMN 13. example 2'

теперь найдем в каждом из них PatIndex по предложенному выше шаблону и вырежем кусок от начала до найденной позиции.
В первом случае получим 'ABCDEKLMN '
А во втором 'ABCDEKLMN 1' - что уже неправильно. Во всяком случае, не подходит к моей цели.
13 дек 11, 14:28    [11756622]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
Glory
Member

Откуда:
Сообщений: 104751
evgenybe
теперь найдем в каждом из них PatIndex по предложенному выше шаблону и вырежем кусок от начала до найденной позиции.
В первом случае получим 'ABCDEKLMN '
А во втором 'ABCDEKLMN 1' - что уже неправильно. Во всяком случае, не подходит к моей цели.

А причем тут вырезание ?
Вы утверждали, что PatIndex не находит двузначные числа
13 дек 11, 14:30    [11756644]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
buser
Что за мания такая... Нельзя чтоль на клиенте парсить... и вставлять куда нужно...? TSQL Regular Expression Workbench ну или CLR процедурку настругайте...

Почему нельзя? - Конечно можно. Но для моей задачи не подходит. Потому что моя задача предполагает сложный парсинг (не только по 1. 2. ...), а затем перезапись в другую таблицу в раздельные записи и поля с последующим уничтожением исходной таблицы из которой это взято. А сама исходная таблица представляет из себя кучу дерьма взятого из документа Word слепленного в одно единственное поле.

Использовать такую таблицу данных нельзя, и потому предполагается сначала переписать ее в нормальном виде в таблицу у которой все будет разложено изначально по нужным полям.
Так вот - если парсить на клиенте, то это занимает офигинительную кучу времени. А если в самой базе данных, то все проходит за несколько минут.
13 дек 11, 14:38    [11756734]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
iap
Member

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

1. найти пару цифра+точка (PATINDEX())
2. найти позицию нецифры, начиная с найденной цифры, но в обратном порядке (REVERSE())
3. выделить фрагмент с начальной позиции поиска до найденной нецифры. (LEFT())

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

Понадобятся LEFT(), STUFF(), PATINDEX(), REVERSE()
13 дек 11, 14:55    [11756915]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Можно сгенерировать таблицу с вариантами чисел с точками (1., 2., ...) и PATINDEX'ом сцепить её с таблицей, строки которой нужно разобрать.

declare @x table(f1 varchar(100))

insert @x values('some string')
insert @x values('first 1. example')
insert @x values('second 2. example')
insert @x values('other 13. example')
insert @x values('1. Раздел первый 2. Раздел второй 3. Вася идет на войну. 4. Вася возвращается с войны')

select f1, num, n0, n1, substring(f1, n0, n1-n0) f2
from
(	select f1, num-i num,
		min(case i when 0 then n end) n0,
		isnull(min(case i when 1 then n end), len(f1) + 1) n1
	from
	(	select x.f1, charindex(n.n, ' '+x.f1) n, row_number() over(partition by x.f1 order by charindex(n.n, ' '+x.f1) ) num
		from @x x
		inner join
		(	select ' '+cast(a*10+b as varchar)+'.' n -- таблица с числами с точкой
			from
			(select 0 a union all select 1 union all select 2 union all select 3 union all select 4 union all
			select 5 union all select 6 union all select 7 union all select 8 union all select 9) a,
			(select 1 b union all select 2 union all select 3 union all select 4 union all select 5 union all
			select 6 union all select 7 union all select 8 union all select 9 union all select 10) b
		) n on charindex(n.n, ' '+x.f1) > 0
		where patindex('%[1-9].%', x.f1) > 0
	) x
	cross join (select 0 i union all select 1) i
	where num-i > 0
	group by f1, num-i
) x


Только не вырезаются части строк, в которых в начале не стоит цифра с точкой ('some string', 'first 1. example', 'second 2. example', 'other 13. example'). Но тогда можно искусственно подставить, например, '0. ', и добавить это число с точкой в сгенерированную таблицу.
Ну, и само собой, неправильно будут обрабатываться случаи, когда число с точкой - это не разделитель: '1. Петя получил оценку 5.'.
13 дек 11, 15:10    [11757093]     Ответить | Цитировать Сообщить модератору
 Re: CharIndex, PatIndex и регулярные выражения  [new]
мимо
Guest
если 2005 и далее, то тут и тут
13 дек 11, 16:01    [11757644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить