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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

création d'une fonction concat


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 73

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 126
    Points
    126
    Par défaut création d'une fonction concat
    Bonjour,
    Je suis en train de basculer de mysql vers postgresql, et tente d'écrire des fonctions qui ne se trouvent pas en postgresql.
    J'ai définit une fonction concat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE FUNCTION "public"."concat" (s1 char, s2 char, s3 char) RETURNS char AS
    $body$
    BEGIN
     
    RETURN s1||s2||s3;
     
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    qui fonctionne correctement sauf dans un cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select concat('x',' ','y')
    qui me renvoit 'xy' et pas 'x y'
    Quelqu'un aurit il une suggestion ?

    Merci d'avance

    Bonne journée à tous
    MS

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Ca m'a surpris au début, et en effet on a bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 't'||' '||'r'; 
     
    't r'
    Puis j'ai vu le type CHAR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 't'::char||' '::char||'r'::char; 
     
    'tr'
    Utilisez VARCHAR et non CHAR pour s1, s2 et s3, ainsi qu'en retour. Evitez le type CHAR en général sous Postgres.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 73

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Merci.
    Par contre je ne comprends pas le comportement avec CHAR.
    Bonne Journée
    Ms

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par MarcS Voir le message
    Par contre je ne comprends pas le comportement avec CHAR.
    En fait le type CHAR est toujours complété par des espaces pour atteindre la longueur du champ. Par exemple, un champ CHAR(5) dans lequel on met 'TB' aura en fait 'TB ' comme valeur, alors qu'un champ VARCHAR aurait 'TB'.

    La fonction de concaténation || gère des VARCHAR, elle convertit donc les arguments en VARCHAR s'ils ne le sont pas, et dans cette conversion tous les espaces à la fin d'un champ CHAR sont supprimés car jugés inutiles (supposés ajoutés automatiquement par le SGBD).

    Par contre un champ VARCHAR avec uniquement des espaces reste inchangé par || car les espaces sont jugés "utiles" (ajoutés volontairement).

    Je ne suis pas développeur postgres mais la logique est là .

    Comme je le disais, mieux vaut toujours utiliser VARCHAR plutot que CHAR pour éviter de mauvaises surprises.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2011, 11h54
  2. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  3. Réponses: 16
    Dernier message: 24/10/2006, 21h37
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo