Bonjour,
J'ai dans la BDD de mon application de nombreuses données alphanumériques (noms, prénoms, noms de club, noms de villes, etc...) pouvant contenir des accents ou des caractères spéciaux.
Pour éviter la saisie de doublons, ou pour rechercher des éventuels doublons, je souhaite donc créer une fonction qui supprime les caractères spéciaux et les accents, avant de lancer la recherche sur une chaine de caractère.
Ce remplacement peut être effectué directement dans une requête, et dans ce cas, la fonction utilisée est une fonction stockée avec ma BDD :
Mais je peux également avoir besoin d'utiliser cette fonction à d'autres endroits. Pour éviter de solliciter le serveur inutilement, j'ai donc créé une fonction qui fait la même chose en C# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 -- Function: fct_format_string3(text) -- DROP FUNCTION fct_format_string3(text); CREATE OR REPLACE FUNCTION fct_format_string3(text) RETURNS text AS $BODY$ SELECT replace(translate(translate(replace(replace(LOWER($1),'æ','ae'),'','oe'), 'âäàéèêëîïöôûü', 'aaaeeeeiioouu'), '&$*@^#- _', ''),'''',''); $BODY$ LANGUAGE sql VOLATILE COST 100; ALTER FUNCTION fct_format_string3(text) OWNER TO postgres;
Je me demande cependant si une telle fonction est vraiment intéressante par rapport à la fonction SQL en terme de performances? Y a t'il moyen de l'optimiser?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public static string fctFormatString(string text) { // Récupération de la chaine de caractère originale et passage en minuscule StringBuilder newText = new StringBuilder(text.ToLower()); // Gestion des "accents" // -> déclaration de variables de conversion "accents" string accent = "àáâãäåòóôõöøèéêëìíîïùúûüÿñç"; string sansAccent = "aaaaaaooooooeeeeiiiiuuuuync"; // -> conversion des chaines en tableaux de caractères char[] tabAccent = accent.ToCharArray(); char[] tabSansAccent = sansAccent.ToCharArray(); // -> pour chaque accent, remplacement for (int i = 0; i < accent.Length; i++) { newText.Replace(tabAccent[i].ToString(), tabSansAccent[i].ToString()); } // Gestion des "caractères spéciaux" // -> déclaration de la variable de conversion "caractères spéciaux" string carSpeciaux = "&$*@^#- _"; // -> conversion des chaines en tableaux de caractères char[] tabCarSpeciaux = carSpeciaux.ToCharArray(); // -> pour chaque caractère spécial, remplacement for (int i = 0; i < carSpeciaux.Length; i++) { newText.Replace(tabCarSpeciaux[i].ToString(), ""); } // Gestion des "æ" et "" newText.Replace("æ", "ae"); newText.Replace("", "oe"); return newText.ToString(); }
Merci,
Partager