IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 

 
OuvrirSommaireFonctions sur les chaines de caracteres
 
Sélectionnez
CREATE 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;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez
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;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez
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;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez
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;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez
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;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez
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;
Créé le 30 août 2005  par Damien Griessinger (HpAlpha)

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

 
Sélectionnez
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;
Créé le 27 août 2006  par Gerald Salin (gerald2545)

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Damien Griessinger Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.