begin process at 2010 07 29 22:29:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fonctions

 > SOUNDEX ELARGIE

SOUNDEX ELARGIE


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fonctions Classé sous :soundex, recherche Niveau :Initié Date de création :15/10/2004 Vu :3 275

Auteur : kspr

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

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

  • 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
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



 Sources de la même categorie

Source avec Zip CALCUL UNE DIFFÉRENCE DE DATE EN FONCTION DE JOURS FÉRIÉS/TR... par Sieurcoug
Source avec Zip CONVERSION DE NOMBRE EN LETTRES (SQL) par wormlore
NO HTML BALISE [MYSQL] par abdoulax
MYSQL : FONCTION POUR GÉRER DES COMPTEURS ÉQUIVALENT AUX SÉQ... par maitredede
RÉINDEXER TOUTES LES TABLES D'UNE BASE DE DONNÉES par pneau

 Sources en rapport avec celle ci

SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI B... par skweeky
RECHERCHE DU PREMIER IDENTIFIANT MANQUANT (TROU) D'UNE TABLE par djhal
REQUETE DE TEXTE INTEGRAL AVEC MYSQL par rahou
MOTEUR DE RECHERCHE MULTI-MOTS AVEC UNE PROCÉDURE STOCKÉE par Fredon88
T-SQL PROCÉDURE DE RECHERCHE DE PROCÉDURES À PARTIR D'UN TEX... par MaRsIgLiA

Commentaires et avis

Commentaire de Domilo le 18/10/2004 09:46:27

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+

Commentaire de oluha le 15/12/2004 17:04:06

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...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

SoundEx [ par juki_webmaster ] Bonjour,Je voit quelques sources tout en tour de codes-sources et meme cs qui utilise cette 'methode de recherche' parler du SoundEx.Je souhaite savoi Fonction Difference (soundex) SQL server [ par oluha ] BonjourJ'ai besoin d'utiliser la fonction Difference (qui se base sur le soundex) mais je trouve qu'elle n'est pas assez précise du fait que le sounde Recherche dans une table [ par Fildomen ] sltquelle est la commande pour chercher un mot dans une table o&#249; la colonne "TXT" contient du texte???et classer les r&#233;ponses par pertinence Recherche Approximative [ par eowene ] Bonjour &#224; tous. J'aimerais savoir comment faire pour faire une recherche approximative sur un champ de ma base de donn&#233;es. Je m'explique. pb avec les caractères génériques !!!! [ par GerardChezy ] Bonjour.J'ai un pb dans ma requete (sur sqlserver 2000) avec le caract&#232;re g&#233;n&#233;rique _ (celui qui remplace 1 caract&#232;re).Lorsque je indexation mysql [ par dibouched ] bojour , j'ai une base de donn&#233;es mysql et je cherceh comment&nbsp; indexer des colonne pour une recherche fulltext ensuite mon probleme est que quote et recherche de texte intégral [ par karn ] Bonjour,J'ai cr&#233;e une base qui supporte la recherche de texte integral sous sql server, les requetes de recherche marche bien sauf avec les mot c Soundex, ou Ratcliff Obershelp Levenshtein algorytme [ par pluplu ] Bonjour, quelqu'un a t'il d&#233;ja impl&#233;menter la technique Soundex, ou Ratcliff Obershelp Levenshtein dans une stored proc&#233;dure en SQL.Je Moteur de recherche SQL 2000 [ par vindavid38 ] ZanTarBonjour je souhaiterais savoir&nbsp; si sql 2000 a un moteur sp&#233;cial pour le fonctionnement du&nbsp;partitionnement horizontal?? Est ce que recherche mot clé [ par nick774 ] Salut, On m'a redirig&#233; sur votre site alors je tente ma chance... Soit: lechamp1 et lechamp2 les &#233;l&#233;ments du formulaire (page1.asp) c


Nos sponsors


Sondage...

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales