helpf.pro
Регистрация
 0 
Распечатать

1С 7.x : Как сравнить похожие строки (неполное совпадение строк)?

Ниже привожу пример функции нечеткого сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше 0.8 (80%)

Код
CREATE FUNCTION fn_FuzzyCompareString(
@Stri1 varchar(250),
@Stri2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN

DECLARE @Str1 varchar(250), @Str2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)

SELECT
@LenStr=1,
@SCountVar=0 ,
@SCountEq=0,
@res=0

Set @Str1 = replace(LTRIM(RTRIM(upper(@Stri1))),'.',' ')
Set @Str2 = replace(LTRIM(RTRIM(upper(@Stri2))),'.',' ')

if ((@MaxLen <= 0) or (Len(@Str1)=0) or (Len(@Str2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr<=@MaxLen)
BEGIN
Set @NumSymbStr2=1
Set @Cnt2=0

While ((@Cnt2+@LenStr)<=LEN(@Str2))
BEGIN

Set @SubStr = '%'+SUBSTRING(@Str2,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str1)<>0)
begin
Set @SCountEq=@SCountEq+1
end

Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END


Set @NumSymbStr2=1
Set @Cnt2=0

While ((@Cnt2+@LenStr)<=LEN(@Str1))
BEGIN

Set @SubStr = '%'+SUBSTRING(@Str1,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str2)<>0)
begin
Set @SCountEq=@SCountEq+1
end

Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END

Set @LenStr=@LEnStr+1
END

end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert(Numeric (10,5),@SCountEq)/Convert(Numeric (10,5),@SCountVar)
END

RETURN @Res
END


Использование этой функции (на примере прямого запроса к справочнику ФизЛица для 1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8

Код
DECLARE @FIO varchar(250)

Set @FIO = 'Иванов Петр'

SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Разместил:   Версии: | 7.x |  Дата:   Прочитано: 8523
 0 
Распечатать
Возможно, вас также заинтересует
Момент Времени и Граница, назначение, примеры использования 17
Момент времени: Фирма 1С описывает так: Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений...
Фильтрация иерархического справочника по какому-либо условию в форме списка 0
Есть ли в 8.х аналог ИспользоватьСписокЭлементов? В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список...
Функция дни рождения сотрудников 0
Данная функция написана для ЗиК 7.7 //Функция подбирает окончание для возраста Функция СтрГода(Возраст) Остаток = Возраст%10; Если Остаток = 1 Тогда Стр = "год"; ИначеЕсли ((Остаток > 1) и (Остаток < 5)) Тогда Стр = "года"; Иначе...
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.