Les meilleures sources PostgreSQL

Les meilleures sources PostgreSQLConsultez toutes les sources
Nombre d'auteurs : 4, nombre de sources : 38, dernière mise à jour : 20 juin 2005
Sommaire→Fonctions sur les chaines de caracteresCREATE OR REPLACE FUNCTION "public"."soundexfr" (text) RETURNS text AS
$body$
/*
Fonction SOUNDEX francisé
Exemple : SELECT soundexfr('durand'),soundexfr('durhand'),soundexfr('durond'),soundexfr('dupond');
D653 D653 D653 D153
*/
DECLARE
st text;
st2 text;
i int2;
ch char;
BEGIN
st2:='';
-- on transforme les voyelles et on passe en majuscule
st:=translate($1,'aàäâeéèêëiïîoôöuùûücç','AAAAEEEEEIIIOOOUUUUCC');
st:=upper(st);
-- on enleve les espaces
FOR i IN 1..length(st) LOOP
IF substring(st,i,1)<>' ' THEN
st2:=st2||substring(st,i,1);
END IF;
END LOOP;
st:='';
FOR i IN 1..length(st2) LOOP
IF NOT (substring(st2,i,1) IN ('A','E','I','O','U','Y','H','W')) THEN
st:=st||substring(st2,i,1);
END IF;
END LOOP;
st2:=substring(st,1,1);
FOR i IN 2..length(st) LOOP
ch:=substring(st,i,1);
IF ch IN ('B','P') THEN st2:=st2||'1';
ELSIF ch IN ('C','K','Q') THEN st2:=st2||'2';
ELSIF ch IN ('D','T') THEN st2:=st2||'3';
ELSIF ch='L' THEN st2:=st2||'4';
ELSIF ch IN ('M','N') THEN st2:=st2||'5';
ELSIF ch='R' THEN st2:=st2||'6';
ELSIF ch IN ('G','J') THEN st2:=st2||'7';
ELSIF ch IN ('S','X','Z') THEN st2:=st2||'8';
ELSIF ch IN ('F','V') THEN st2:=st2||'9';
END IF;
END LOOP;
st:=substring(st2,1,1);
FOR i IN 1..length(st2) LOOP
IF substring(st2,i,1) <> substring(st,length(st),1) THEN
st:=st||substring(st2,i,1);
END IF;
END LOOP;
IF length(st)<4 THEN
FOR i IN length(st)..4 LOOP
st:=st||'0';
END LOOP;
ELSIF length(st)>4 THEN
st:=substring(st,1,4);
END IF;
return st;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;CREATE OR REPLACE FUNCTION "public"."encode64" (chaine text) RETURNS text AS
$body$
/*
Encodage en base 64
Exemple : SELECT encode64('Salut');
Ks5iTNG
*/
DECLARE
i integer;
a integer = 0;
x integer;
b integer = 0;
resultat text = '';
codes64 text = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
BEGIN
FOR i IN 1..length(chaine) LOOP
x:=ascii(substring(chaine from i for 1));
b:=b*256+x;
a:=a+8;
WHILE a>=6 LOOP
a:=a-6;
x:=b/(1<<a);
b:=b%(1<<a);
resultat:=resultat||substring(codes64 from x+1 for 1);
END LOOP;
END LOOP;
IF a>0 THEN
x:=b<<(6-a);
resultat:=resultat||substring(codes64 from x+1 for 1);
END IF;
return resultat;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;CREATE OR REPLACE FUNCTION "public"."decode64" (chaine text) RETURNS text AS
$body$
/*
Decodage en base 64
Exemple : SELECT decode64('Ks5iTNG');
Salut
*/
DECLARE
i integer;
a integer = 0;
x integer;
b integer = 0;
codes64 text = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
resultat text = '';
BEGIN
FOR i IN 1..length(chaine) LOOP
x:=position(substring(chaine from i for 1) in codes64)-1;
IF x>=0 THEN
b:=b*64+x;
a:=a+6;
IF a>=8 THEN
a:=a-8;
x:=b>>a;
b:=b%(1<<a);
x:=x%6;
resultat:=resultat||chr(x);
END IF;
ELSE
Exit;
END IF;
END LOOP;
return resultat;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;CREATE OR REPLACE FUNCTION "public"."inverserchaine" (chaine text) RETURNS text AS
$body$
/*
Inverse la chaine
Exempe : SELECT inverserchaine('postgresql');
lqsergtsop
*/
DECLARE
i integer;
resultat text = '';
BEGIN
FOR i IN REVERSE length(chaine)..1 LOOP
resultat:=resultat||substring(chaine from i for 1);
END LOOP;
return resultat;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;CREATE OR REPLACE FUNCTION "public"."minimizetext" (text) RETURNS text AS
$body$
/*
Fonction minimizetext
Permet de simplifier une phrase au maximum
-> Suppression des lettres en doubles
-> Conversion des accents
Exemple : SELECT minimizetext('hellllooooo monnnnndeeee');
helomonde
*/
DECLARE
chaine text;
desti text;
last char(1);
current char(1);
i integer;
BEGIN
chaine:=translate(lower($1),'àâéèêëîïìôòùû','aaeeeeiiioouu');
chaine:=replace(chaine,'-','');
chaine:=replace(chaine,' ','');
chaine:=trim(chaine);
last:=' ';
desti:='';
FOR i IN 1..length(chaine) LOOP
current:=substring(chaine,i,1);
IF current<>last THEN
last:=current;
desti:=desti||current;
END IF;
END LOOP;
RETURN desti;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;CREATE OR REPLACE FUNCTION "public"."stroccurence" (chaine text, souschaine text) RETURNS integer AS
$body$
/* Compte le nombre d'occurence d'une souschaine dans une chaine
Exemple : SELECT stroccurence('Ici un mot, et la un deuxieme mot','mot');
2
*/
BEGIN
return array_upper(string_to_array(chaine,souschaine),1)-1;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;La fonction prend en entrée une chaine de caractère 'input' et renvoie en sortie une chaîne de caractères 'output' qui correspond à 'input' encodée en code128 pour la création de code-barres. Dans un logiciel de traitement de texte quelconque, il suffit d'appliquer la police code128 à la chaîne 'output' pour avoir une jolie succession de barres noires et blanches, lisible par un lecteur de code-barres quelconque (pourvu qu'il lise la police code128).
CREATE FUNCTION text2code128(text) RETURNS text AS $body$
/*
Fonction pour transformer une chaine de caractere en chaine code 128
Traduction de la fonction VB de Grandzebu par Nicolas Fanchamps en PL/SQL
Portage de PL/SQL vers PL/pgsql (postgresql 7.4.2) par Gerald Salin, le 07/10/05
Pre-Requis : installation du langage plpgsql dans la base ou sera utilisee la fonction
on peut appeler la fonction par la commande : select text2code128('input') */
DECLARE
ind integer; /* Indice d avancement dans la chaine de caractere */
chaine ALIAS FOR $1; /*recuperation de l argument dans une variable*/
longueur integer; /* longueur de la chaine passee en argument */
checksum integer; /* Caractere de verification de la chaine codee */
mini integer; /* nbr de caracteres numeriques en suivant */
dummy integer; /* Traitement de 2 caracteres a la fois */
tableB BOOLEAN; /* Booleen pour verifier si on doit utiliser la table B du code 128 */
code128 text; /* code 128 de l argument */
BEGIN
ind:=1;
code128 := '';
longueur := LENGTH(chaine); /* recupere la longueur de la chaine passee en argument */
IF longueur < 1 THEN
RAISE EXCEPTION ' Argument Absent!!!';
ELSE
FOR ind IN 1 .. longueur --test de la validite des caracteres composant l argument LOOP
IF (ASCII(SUBSTR(chaine, ind, 1)) < 32) OR (ASCII(SUBSTR(chaine, ind, 1)) > 126) THEN
RAISE EXCEPTION ' Argument invalide!!!';
END IF;
END LOOP;
END IF;
tableB := TRUE;
WHILE ind <= longueur LOOP
IF (tableB = TRUE) THEN
--Voir si c'est interessant de passer en table C
--Oui pour 4 chiffres au debut ou a la fin, sinon pour 6 chiffres
IF ((ind = 1) OR (ind+3 = longueur)) THEN
mini := 4;
ELSE
mini := 6;
END IF;
--TestNum : si les mini caracteres a partir de ind son numeriques, alors mini = 0
mini := mini-1;
IF ((ind + mini) <= longueur) THEN
WHILE mini >= 0 LOOP
IF (ASCII(SUBSTR(chaine, ind+mini , 1)) < 48) OR (ASCII(SUBSTR(chaine, ind+mini, 1)) > 57) THEN
EXIT;
END IF;
mini := mini-1;
END LOOP;
END IF;
--Si mini < 0 on passe en table C
IF (mini < 0) THEN
IF (ind = 1) THEN --Debuter sur la table C
code128 := CHR(205);
ELSE --Commuter sur la table C
code128 := code128 || CHR(199);
END IF;
tableB := FALSE;
ELSE
IF (ind = 1) THEN --Debuter sur la table B
code128 := CHR(204);
END IF;
END IF;
END IF;
IF (tableB = FALSE) THEN --On est sur la table C, on va essayer de traiter 2 chiffres
mini := 2;
mini := mini-1;
IF (ind + mini <= longueur) THEN
WHILE mini >= 0 LOOP
IF (ASCII(SUBSTR(chaine, ind+mini , 1)) < 48) OR (ASCII(SUBSTR(chaine, ind+mini, 1)) > 57) THEN
EXIT;
END IF;
mini := mini-1;
END LOOP;
END IF;
IF (mini < 0) THEN --OK Pour 2 chiffres, les traiter
dummy := SUBSTR(chaine, ind, 2)::integer;
IF (dummy < 95) THEN
dummy := dummy + 32;
ELSE
dummy := dummy + 100;
END IF;
code128 := code128 || CHR(dummy);
ind := ind + 2;
ELSE
--On a pas deux chiffres, retourner en table B
code128 := code128 || CHR(200);
tableB := TRUE;
END IF;
END IF;
IF (tableB = TRUE) THEN
code128 := code128 || SUBSTR(chaine, ind, 1);
ind := ind + 1;
END IF;
END LOOP;
--Calcul de la clef de controle
FOR ind IN 1 .. LENGTH(code128) LOOP
dummy := ASCII(SUBSTR(code128, ind, 1));
IF (dummy < 127) THEN
dummy := dummy - 32;
ELSE
dummy := dummy - 100;
END IF;
IF (ind = 1) THEN
checksum := dummy;
END IF;
checksum := mod(checksum + (ind-1) * dummy, 103);
END LOOP;
--Calcul du code ascii de la clef de controle
IF (checksum < 95) THEN
checksum := checksum + 32;
ELSE
checksum := checksum + 100;
END IF;
--Ajout de la clef et du STOP a la fin de la chaine codée
code128 := code128 || CHR(checksum) || CHR(206);
RETURN code128;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;


