Soundex elargie

0/5 (2 avis)

Snippet vu 6 013 fois - Téléchargée 31 fois

Contenu du snippet

La fonction soundex de SQL ne retourne qu'un son sur 5 caractères. Pour affiner les comparaison de sonorité de phrase, la fonction big_soundex(@chaine nvarchar, @longueur int) retourne une chaine sonore d'une longueur défini par le parametre @longueur qui est cependant limité a 10 caractères ici, mais a vous de modifier le code pour augmenter (attention au delai d'execution dans ce dernier cas)

Source / Exemple :


CREATE FUNCTION big_soundex
	(@WordString nvarchar(50), @SoundExLen int)
RETURNS nvarchar(10)
AS
begin
declare @Counter int
declare @CurrChar char(1)
declare @retVal nvarchar(10)

// test de la longueur demandé
If @SoundExLen > 10 
begin
    set @SoundExLen = 10
end
if @SoundExLen < 4 
begin
    set @SoundExLen = 4
end

set @SoundExLen = @SoundExLen - 1

// soundex ne travail qu'avec des lettres capitale
set @WordString = upper(@WordString)

SET @Counter = 1
//on parcours la chaine et on remplace tout ce qui n'est pas une lettre par un blanc
WHILE @Counter <= len(@WordString)
BEGIN
    If ASCII(SUBSTRING(@WordString, @Counter, 1)) < 65 Or ASCII(SUBSTRING(@WordString, @Counter, 1)) > 90
    BEGIN
        set @WordString = Left(@WordString, @Counter - 1) + ' ' + SUBSTRING(@WordString, @Counter + 1, len(@WordString))
    End
    set @counter = @counter + 1
END
//suppression des eventuels espace en debut et en fin de chaine
set @WordString = lTrim(rtrim(@WordString))

//création du 'son'
If Len(lTrim(rtrim(@WordString))) = 0 
begin
    set @retVal = ''
end
Else
begin
    set @retVal = @WordString

    set @retVal = Replace(@retVal, 'A', '0')
    set @retVal = Replace(@retVal, 'E', '0')
    set @retVal = Replace(@retVal, 'I', '0')
    set @retVal = Replace(@retVal, 'O', '0')
    set @retVal = Replace(@retVal, 'U', '0')
    set @retVal = Replace(@retVal, 'Y', '0')
    set @retVal = Replace(@retVal, 'H', '0')
    set @retVal = Replace(@retVal, 'W', '0')
    set @retVal = Replace(@retVal, 'B', '1')
    set @retVal = Replace(@retVal, 'P', '1')
    set @retVal = Replace(@retVal, 'F', '1')
    set @retVal = Replace(@retVal, 'V', '1')
    set @retVal = Replace(@retVal, 'C', '2')
    set @retVal = Replace(@retVal, 'S', '2')
    set @retVal = Replace(@retVal, 'G', '2')
    set @retVal = Replace(@retVal, 'J', '2')
    set @retVal = Replace(@retVal, 'K', '2')
    set @retVal = Replace(@retVal, 'Q', '2')
    set @retVal = Replace(@retVal, 'X', '2')
    set @retVal = Replace(@retVal, 'Z', '2')
    set @retVal = Replace(@retVal, 'D', '3')
    set @retVal = Replace(@retVal, 'T', '3')
    set @retVal = Replace(@retVal, 'L', '4')
    set @retVal = Replace(@retVal, 'M', '5')
    set @retVal = Replace(@retVal, 'N', '5')
    set @retVal = Replace(@retVal, 'R', '6')

    set @CurrChar = Left(@retVal, 1)
    set @counter = 2
//on retire les son successif iddentique
    while @counter <= len(@retVal)
    begin
        If substring(@retVal, @Counter, 1) = @CurrChar
	begin
			set @retVal = Left(@retVal, @Counter - 1) + substring(@retVal, @Counter + 1, len(@retVal))
	end
        Else
	begin
            set @CurrChar = SUBSTRING(@retVal, @Counter, 1)
        End
    set @counter = @counter + 1
    end

//suppression des blanc
    set @retVal = Replace(@retVal, ' ', '')

//suppression des 0
    set @retVal = substring(@retVal, 2, len(@retVal))
    set @retVal = Replace(@retVal, '0', '')

// on ajoute des 0 si le 'son' est trop court pour etre sur d'avoir le nombre de caractère voulue
    set @retVal = @retVal + REPLICATE('0', @SoundExLen)
    set @retVal = Left(@WordString, 1) + Left(@retVal, @SoundExLen)

End 
// retour du son
return @retVal
end

Conclusion :


exemple :
select mabase.dbo.big_soundex('soundex ne retourne pas un son assez précis', 10)
retourne :
S532500000

alors que :
select soundex('soundex ne retourne pas un son assez précis')
ne retourne que
S532

A voir également

Ajouter un commentaire Commentaires
Messages postés
71
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
5 février 2009

Salut

Ta fonction me serait vraiment utile et j'aimerai créer une nouvelle fonction DIFFERENCE à partir de ton soundex. Mais je ne sais pas comment fonctionne la fonction difference d'origine. Je ne sais pas si tu peux m'éclairer...
Messages postés
32
Date d'inscription
jeudi 31 janvier 2002
Statut
Membre
Dernière intervention
22 février 2005

Bonjour,

Ton code est vraiment instructif et utile. Bravo.

Petit ajustement : Soundex, sur ma base de test, fonctionne avec des minuscules. Je pense qu'il faut que la base gère les chaînes en mode non sensible à la casse (et pas sensible aux accentués est un plus dans ce cas)

A+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.