Em algumas situações necessitamos comparar duas frases e tentar identificar a proximidade entre elas. O SQL server fornece a função SOUNDEX que nos permite comparar pela fonética se duas palavras são parecidas. Mas quando temos uma frase, é necessário comparar palavra por palavra, o que torna o processo um pouco chato de se realizar e oneroso no quesito performance.
Também, temos que levar em consideração que algumas palavras podem fornecer resultados parecidos. Mas não são a mesma palavra. Assim precisamos criar mecanismos para aumentar a acertividade de nossa função.
Veja o caso abaixo, quando comparamos duas palavras. Elas possuem a mesma fonética!
Experimente o seguinte no query analyzer:
select soundex('real'), soundex('royal')
Se comparmos uma frase, utilizando o SOUNDEX, iremos receber o comparativo da primeira palavra apenas… Isto pode ser visto no próximo exemplo:
select soundex('real Brasil'), soundex('Real America')
Bem, então poderiamos quebrar duas frases em várias palavras e comparar palavra por palavra se elas possuem a mesma fonética. A função abaixo foi utilizada para isto.
Para utilizá-la, é necessário passar 3 parâmetros… 2 Frases a comparar e o número de palavras dentro da frase que serão comparadas.Ela retorna 1 se a frase possuir a mesma fonética e 0 caso contrário.
Este exemplo utiliza duas variáveis de tabela… Quebra as frases em palavras dentro destas variáveis, mais ou menos como o comando SPLIT que muitos programadores utilizam em outras linguagens. Depois percorre linha a linha da tabela comparando uma palavra com outra que esteja na mesma posição.
Veja o código:
CREATE FUNCTION proximidadeNomes (
@texto as varchar(100),
@comparar as varchar(100),
@palavras int = 7
)
RETURNS int
AS
BEGIN
Declare @nomes1 table
(Id int primary key,nome1 varchar(50))
Declare @nomes2 table
(Id int primary key,nome2 varchar(50))
Declare @caracter char(1),
@total int,
@item int,
@ultimo int,
@words int,
@cursor1 Cursor,
@resultado int,
@palavras1 int,
@palavras2 int
SET @resultado =1
SET @item = 1
SET @ultimo =1
SET @total = LEN(@texto) +1
SET @words = 0
--PRIMEIRA FRASE
WHILE @item <=@total
BEGIN
--print substring(@texto,@item,1)
IF substring(@texto,@item,1) = ' '
BEGIN
SET @words = @words +1
IF @words<=@palavras
INSERT INTO @nomes1 (Id,nome1) values (@words, substring(@texto,@ultimo,@item-@ultimo))
SET @ultimo= @item +1
END
SET @item = @item +1
END
--SEGUNDA FRASE
SET @item = 1
SET @ultimo =1
SET @total = LEN(@comparar) +1
SET @words = 0
IF ABS(LEN(@texto) -LEN(@comparar)) <=20
BEGIN
WHILE @item <=@total
BEGIN
--print substring(@texto,@item,1)
IF substring(@comparar,@item,1) = ' '
BEGIN
SET @words = @words +1
IF @words<=@palavras
INSERT INTO @nomes2 (Id,nome2) values (@words, substring(@comparar,@ultimo,@item-@ultimo))
SET @ultimo= @item +1
END
SET @item = @item +1
END
--COMPARANDO OS RESULTADOS
SET @cursor1 = CURSOR FOR SELECT CASE WHEN SOUNDEX(nome1)=SOUNDEX(nome2) THEN 1 ELSE 0 END [IGUAL]
FROM @nomes1 t1, @nomes2 t2 WHERE t1.Id=t2.Id
--
OPEN @cursor1
FETCH NEXT FROM @cursor1
INTO @resultado
WHILE (@@FETCH_STATUS = 0) AND @resultado=1
BEGIN
FETCH NEXT FROM @cursor1
INTO @resultado
END
CLOSE @cursor1
DEALLOCATE @cursor1
END
ELSE
BEGIN
SET @resultado =0
END
-- Return the result of the function
RETURN @resultado
END
GO
Experimente realizar agora a seguinte comparação:
SELECT [DBO].[PROXIMIDADENOMES]('Real América Sul','Real Brasil AIC',1)
Repita agora modificando o número de palavras :
1-SELECT [DBO].[PROXIMIDADENOMES]('Real América','Real Brasil',2)
2-SELECT [DBO].[PROXIMIDADENOMES]('Real América ABC','Real América OMG ',2)
3-SELECT [DBO].[PROXIMIDADENOMES]('Real América ABC','Real América OMG ',3)
Tiago Gomes Larios