PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 18/04/2013 15:25:58

Geo-x
Membre

RESOLU - Utilisation de la fonction initcap() avec caractères spéciaux

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

#2 24/04/2013 15:52:52

Geo-x
Membre

Re : RESOLU - Utilisation de la fonction initcap() avec caractères spéciaux

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

Pied de page des forums