Sep
15

Анализ строки в SQL Server

Author osya    Category Uncategorized     Tags , ,

Возникла следующая задача. Есть таблица в СУБД Microsoft SQL Server, содержащая ~3000 записей. Одно из полей этой таблицы имеет тип varchar(255) и содержит набор текстовых выражений, заключённых в двойные кавычки и разделённых запятыми. Требуется подсчитать количество этих текстовых выражений для каждой записи таблицы.

Я решал задачу с помощью скрипта на T-SQL и с использованием курсоров.

Сначала объявил временную таблицу #t, содержащую уникальный идентификатор исследуемой таблицы и анализируемое поле

create table #t (Код char(24), ObrCou int, RepCou int)
insert into #t
select Код, 0, 0
from ...

Затем объявил курсор по исходной таблице

declare cur cursor for
select ...

Далее открываю курсор, делаю цикл и на каждом шаге подсчитываю количество текстовых выражений

open cur
declare @c1 char(24), @c2 varchar(255), @c3 varchar(255)
fetch next from cur into @c1, @c2, @c3
while @@FETCH_STATUS = 0
begin
	declare @s varchar(255), @i int, @j int, @cou1 int, @cou2 int
	set @s = @c2
	set @cou1 = 0
	while (charindex('"', @s) > 0) begin
		set @i = charindex('"', @s)
		if (@i > 0) begin
		  set @j = charindex('"', @s, @i + 1)
		  if (@j > 0) begin
			if (@j > @i + 1) begin
				set @cou1 = @cou1 + 1
			end
			set @s = right(@s, len(@s) - @j)
		  end
		end
	end

	update #t set ObrCou = @cou1, RepCou = @cou2 where Код = @c1
	fetch next from cur into @c1, @c2, @c3
end
close cur
deallocate cur

select Top 10 * from #t where RepCou <> 0

drop table #t

Количество текстовых выражений записывается в поле RepCou таблицы #t.
Рассмотренный вариант решения работает очень медленно и потому применим только для небольшого количества записей. Я так и не дождался обработки всей таблицы из 3000 записей.
Я пытался копировать анализируемый столбец в Excel. Но Excel у первого текстового выражения убирает двойные кавычки, а остальные оставляет.
Думаю, что для решения поставленной задачи нужно выгрузить исходную таблицу в CSV и дальше анализировать в AWK, R или в Python.

Post comment