Vous n'êtes pas identifié(e).
Bonjour @ tous,
j'essaie désespérément de trouver une solution pour utiliser la fonction initcap() (qui met en majuscule la première lettre de chaque mot dans une chaîne de caractères) avec des caractères spéciaux, dans une BDD en LATIN1.
Malheureusement, quand j'ai des caractères spéciaux, la fonction à tendance à réagir différemment :
Par exemple, si je fais un initcap() sur une valeur 'BIRÉGES DE ÔTRÜC' ça me donne "BirÉGes De ÔTrÜC"
Connaissez-vous une alternative qui pourrait fonctionner? parce que j'imagine ne pas être le seul à avoir rencontré le problème...
D'avance merci!
Geo-x
Dernière modification par Geo-x (10/07/2013 14:50:27)
Hors ligne
Bonjour @tous,
j'ai trouvé comment faire, je vous livre donc cette solution qui je l'espère vous sera utile.
1- Créez deux fonctions permettant la mise en majuscule et en minuscule des caractères spéciaux
CREATE OR REPLACE FUNCTION maj_specialchar(text)
RETURNS text AS
$BODY$
DECLARE
input_string text := $1;
BEGIN
input_string := translate(input_string, 'âãäåa', 'ÂÃÄÅA');
input_string := translate(input_string, 'èéêëe', 'ÈÉÊËE');
input_string := translate(input_string, 'ìíîïìi', 'ÌÍÎÏÌI');
input_string := translate(input_string, 'óôõöo', 'ÓÔÕÖO');
input_string := translate(input_string, 'ùúûüu', 'ÙÚÛÜU');
return input_string;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION maj_specialchar(text) OWNER TO postgres;
CREATE OR REPLACE FUNCTION min_specialchar(text)
RETURNS text AS
$BODY$
DECLARE
input_string text := $1;
BEGIN
input_string := translate(input_string, 'ÂÃÄÅA', 'âãäåa');
input_string := translate(input_string, 'ÈÉÊËE', 'èéêëe');
input_string := translate(input_string, 'ÌÍÎÏÌI', 'ìíîïìi');
input_string := translate(input_string, 'ÓÔÕÖO', 'óôõöo');
input_string := translate(input_string, 'ÙÚÛÜU', 'ùúûüu');
return input_string;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION min_specialchar(text) OWNER TO postgres;
2- Et ensuite je lance la focntion suivante:
-- Function: initcap_perso(character varying)
-- DROP FUNCTION initcap_perso(character varying);
CREATE OR REPLACE FUNCTION initcap_perso(character varying)
RETURNS character varying AS
$BODY$
DECLARE
var_decomposition_nom record;
var_nom_corrige varchar;
BEGIN
var_nom_corrige='';
FOR var_decomposition_nom IN SELECT regexp_split_to_table(trim($1),' ')AS nom
LOOP
IF
length(var_decomposition_nom.nom)>0
THEN
var_nom_corrige=var_nom_corrige||maj_specialchar(UPPER(substring(var_decomposition_nom.nom from 1 for 1)))||min_specialchar(lower(substring(var_decomposition_nom.nom from 2 for length(var_decomposition_nom.nom)-1)))||' ';
END IF;
END LOOP;
var_nom_corrige=trim(var_nom_corrige);
return var_nom_corrige;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION initcap_perso(character varying) OWNER TO postgres;
Qui décompose les différents mots contenus dans une cellule, qui les traite un par un, et qui les recompose à l'aide d'une boucle.
@ très vite
Geo-x
Hors ligne