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 :

Concaténation de champ automatique avec conditions


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Concaténation de champ automatique avec conditions
    Bonjour à tous,

    Voici l'idée générale de ma requête. Je souhaiterais pouvoir remplir automatiquement un champ par concaténation via un trigger.

    Ce trigger appel une fonction qui met des conditions à cette mise à jour.

    Voici l'idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE OR REPLACE FUNCTION update()
      RETURNS "trigger" AS $nomfic$
     
        BEGIN
     
    	IF code_insee IS NULL THEN
     
    	NEW.nomfic:='';
     
    	ELSIF nom IS NULL
     
    	NEW.nomfic:='';
     
    	ELSIF nom AND code_insee IS NOT NULL THEN
     
    	NEW.nomfic:=NEW.code_insee||'-'||NEW.nom||'machin';
     
    	END IF;
            RETURN NEW;
     
        END;
    $nomfic$
      LANGUAGE 'plpgsql';
     
    ALTER FUNCTION update()OWNER TO postgres;
     
    CREATE TRIGGER update BEFORE INSERT OR UPDATE
    ON MaTable FOR EACH ROW
    EXECUTE PROCEDURE update();
    En espérant que vous puissiez m'éclairer sur les conditions dans une fonction...

    Merci d'avance.

    Geo-x

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le ELSIF nom devrait certainement être ELSIF nom IS NOT NULL.

    A part ça, il me semble que tout le bout de code peut se réduire à cette ligne, qui produira le même résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NEW.nomfic:=coalesce(NEW.code_insee||'-'||NEW.nom||'machin', '');
    return NEW;

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour estofilo,

    J'avoue que l'utilisation que tu fais de "coalesce" fonctionne magistralement bien!

    Mais j'aimerais comprendre un peu mieux ce que fait cette fonction, j'ai lu une dizaine de docs sur le net mais je ne comprend pas bien.

    Visiblement, elle retourne les valeurs nulls sur les colonnes que l'on met entre parenthèse mais là tu l'a utilisé en lui faisant dire un truc du genre :

    'Renvoies moi une concaténation du code_insee et du nom sinon, si une de ces valeurs est null tu ne mets rien'

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 105
    Points : 28 398
    Points
    28 398
    Par défaut
    Dans la définition de NULL, il est prévu que NULL <opérateur> <expression> renvoie toujours NULL.
    Dans ton cas, la concaténation avec l'une des colonnes à NULL renverra NULL...

    Attention, bien que ce soit ce qui est prévu par la norme, tous les SGBD ne respectent pas cette règle.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    coalesce(a,b) renvoie simplement a si a n'est pas NULL, et sinon elle renvoie b.
    a et b peuvent être des colonnes dans une requête, mais ils peuvent aussi être n'importe quelle expression.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Merci
    Merci Estofilo, ça marche niquel!

    (avec un peu de retard je sais...)

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

Discussions similaires

  1. [script.aculo.us] Champ automatique avec checkbox
    Par julia_m dans le forum Bibliothèques & Frameworks
    Réponses: 61
    Dernier message: 20/07/2010, 16h58
  2. créer un champ calculé avec condition
    Par coollehavre2 dans le forum Développement
    Réponses: 2
    Dernier message: 07/08/2008, 13h26
  3. champs calculer avec condition dans un etat
    Par scons dans le forum IHM
    Réponses: 2
    Dernier message: 16/12/2006, 19h58
  4. [MySQL] concaténer une requête sql avec condition
    Par maliak dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 10/02/2006, 12h01
  5. Verrouiller un champ texte avec condition
    Par uskiki85 dans le forum Access
    Réponses: 5
    Dernier message: 09/09/2005, 18h51

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