Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/08/2011, 17h07   #1
Invité de passage
 
Inscription : août 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 2
Points : 1
Points : 1
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 :
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
Geo-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h53   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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 :
1
2
NEW.nomfic:=coalesce(NEW.code_insee||'-'||NEW.nom||'machin', '');
RETURN NEW;
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2011, 15h47   #3
Invité de passage
 
Inscription : août 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 2
Points : 1
Points : 1
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'
Geo-x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 16h21   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2011, 16h47   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h42.


 
 
 
 
Partenaires

Hébergement Web