Soundex elargie

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

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.