SQL - Pesquisa fonética com Soundex (VB6)
Recuperar informações armazenadas em uma fonte de dados não é tão simples quanto parece. Dependendo do ambiente esta tarefa pode ser uma tarefa crítica que deve ser tratada com todo o cuidado. Quanto tratamos com informações que estão armazenadas no formato de strings e que não possuem uma chave numérica para facilitar a busca podemos estar diante de uma tarefa complexa.
O armazenamento de nome e sobrenome em base de dados relacionais pode estar sujeito a uma imprecisão que pode prejudicar recuperação das informações. Vou mostrar um exemplo do que estou querendo dizer usando o SQL Server 2000.
A primeira coisa a fazer é criar uma banco de dados usando o Enterprise Manager. Eu vou criar um banco de dados chamado Teste04.
A seguir vamos abrir o Query Analizer do SQL Server 2000 e criar uma tabela chamada SoundexTeste com apenas duas colunas : nome char(30) e sobrenome char(30)
Na sequência vamos incluir alguns nomes e sobrenomes usando a instrução SQL INSERT INTO conforme figura abaixo:
O script para criar uma tabela e incluir alguns dados | O resultado da inclusão na tabela |
Observando a figura que exibe os dados inseridos na tabela você já sentiu aonde eu quero chegar. Agora eu pergunto como você criaria a sua instrução SQL para recuperar as informações desta tabela a partir do Sobrenome ?
A informação Sobrenome possui valores que se assemelham quanto a pronúncia ( Brown , Braun , Broon, Braum, etc.) portanto não seria tão simples recuperar a informação baseada nos valores desta coluna.
Felizmente o SQL Server possui uma função que nos ajuda a resolver o problema. A função SOUNDEX.
SOUNDEX(a) retorna um código SOUNDEX de quatro caracteres para determinar a semelhança entre duas strings.
Vamos ver como ela funciona: Vamos selecionar todos os clientes com sobrenome parecido com Brown. Para isto vou usar uma instrução SQL SELECT . Abaixo temos a utilização da função Soundex e do resultado obtido:
A seleção retornou os valores acima pois todos eles possuem o mesmo valor para SOUNDEX.
Mas como funciona este tal de SOUNDEX ?
A função SOUNDEX é baseada no
algoritimo Soundex. Este algoritmo foi criado pelo governo
Americano para recuperar nomes para a administração da
Seguridade Social nos arquivos Nacionais. O algoritmo é simples
e esta explicado a seguir.
- Se o
código for maior que quatro caracteres os demais não serão
considerados . Se for menor serão acrescidos Zeros.
-
Você preserva o primeiro caractare da
String e atribui valores conforme a tabela abaixo até 3
caracteres.
- As vogais A,E,I,O,U os caracteres Y,W e H e os demais demais
caracteres não são considerados.
- Os caracteres numéricos são considerados apenas para a
primeira casa , os demais não considerados
- Havendo caracteres repetidos somente o primeiro será
considerado
Valor a ser atribuído ao Caractere | Caractere |
Calculando o valor SOUNDEX p/ a
palavra Brown : B605
B = B |
0 | Todas as demais letras ou palavras muito curtas | |
1 | B , P , F , V | |
2 | C , S , G , J . K , Q , X , Z | |
3 | D , T | |
4 | L | |
5 | M , N | |
6 | R |
A palavra SOUNDEX tem o valor SOUNDEX igual a S532 . Veja se chegou a este resultado: S(é mantido) , OU(não considerados), N=5 , D=3 , E(não considerado) , X=2
E onde entra o Visual Basic nesta história ? Podemos criar uma função com base no algoritmo que retorne os mesmos valores que a função SOUNDEX.
Abaixo a função Soundex que passa uma string como parâmetro . O valor SOUNDEX para cada caractere é calculado pela função ValorSoundex.
Function
Soundex(ByVal texto As String) As String Dim resultado As String Dim i As Long Dim ivalorSoundex As Integer Dim valorPrimeiraLetra As Integer ' soundex é case-insensitive texto = UCase$(texto) ' a primeira letra é copiada no resultado resultado = Left$(texto, 1) valorPrimeiraLetra = ValorSoundex(resultado) For i = 2 To Len(texto) ivalorSoundex = ValorSoundex(Mid$(texto, i, 1)) If ivalorSoundex <> 0 And valorPrimeiraLetra <> ivalorSoundex Then resultado = resultado & ivalorSoundex End If valorPrimeiraLetra = ivalorSoundex ivalorSoundex = 0 Next Soundex = Mid$(resultado, 1, 4) If Len(resultado) < 4 Then Soundex = Soundex & String(4 - Len(resultado), "0") End If End Function |
Function
ValorSoundex(sCaractere As String) As Integer Select Case sCaractere Case "B", "F", "P", "V" ValorSoundex = "1" Case "C", "G", "J", "K", "Q", "S", "X", "Z" ValorSoundex = "2" Case "D", "T" ValorSoundex = "3" Case "L" ValorSoundex = "4" Case "M", "N" ValorSoundex = "5" Case "R" ValorSoundex = "6" End Select End Function |
Vamos testar a 'bichinha' (ela precisa de uma otimizada , não acha ?? ).
Crie um novo projeto no VB do tipo STANDARD EXE e no formulário padrão inclua os controles conforme a figura abaixo:
No evento Click do botão de comando insira o código que chama a função Soundex e atribui o valor retornado a Label1:
Private
Sub Command1_Click() Label1.Caption = Soundex(Text1.Text) End Sub |
Com certeza você encontrará outros usos para SOUNDEX. Bons códigos...
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências: