STRIGANOV SERGEY: Software development.

Разработка программного обеспечения на: C++, T-SQL, VBS, JavaScript, PHP

T-SQL, Find digital sequence

Поиск последовательности символов в строке.

Однажды понадобилось найти номер договора в назначении платежа.
Можно было бы сдалать просто Like '%322223%' к строке.
Но дело осложнялось тем, что в таблице договоров тысячи записей,
и такой поиск был бы слишком медленным.

Было принято решение выполнять предварительный разбор строки (на этапе заполнения таблицы):
выделять из нее цифровые последовательности заданной длинны (в данном примере - 6 цифр. соглашение о нумерации договоров в данной системе)

Затем найденные последовательности записываем во временную таблицу,
и после этого делаем Join временной таблицы с таблицей договоров (где содержатся номера договоров в цифровом представлении).

Хотя код простой, а написание занимает всего несколько минут (вместе с отладкой),
я всеравно решил написать об этом: для тех, кто еще не занаком с возможностями функции patindex
(ну и себе на память).

 Тестировано на:

select @@version
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)   Apr  2 2010 15:53:02
Copyright (c) Microsoft Corporation  Express Edition with Advanced Services on 
Windows NT 5.2  (Build 3790: Service Pack 2) 

T-SQL script:

declare  @ControlID table( [cid] int	)
declare @i int, @sControlTmp varchar(max), @sFilter varchar(50)

set @sControlTmp='Общество с ограниченной ответственностью "Ромашка", 7732222332,
				  оплата по счету №-801037 от 01.06.12 по договору SN801037/12 ндс не облагается'
set @sFilter='%[^0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9]%'

select @i = patindex(@sFilter, @sControlTmp)
while @i > 0
begin
									-- print substring(@sControlTmp, @i+1, 6)
	insert into @ControlID ( [cid])
	select cast(substring(@sControlTmp, @i+1, 6) as int)  as [cid]
	set @sControlTmp = replace(@sControlTmp, substring(@sControlTmp, @i+1, 6), '')
	select @i = patindex(@sFilter, @sControlTmp)
end

select @sControlTmp as [test]
select * from @ControlID 

 

Add comment