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

PostgreSQL Discussion :

PL/PGSQL recoder une variable


Sujet :

PostgreSQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut PL/PGSQL recoder une variable
    Bonjour,

    Tout d'abord je tiens à m'excuser si je ne poste pas au bon endroit (je n'ai pas vu de forum pour pl/pgsql).

    Ma question maintenant :
    J'essaie de recoder une variable age (de type integer) en classes (dans une nouvelle variable de type varchar).
    Voici la fonction que j'ai créée :
    Code plpgsql : 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
    30
    31
    32
    create or replace function ageclassesfunction() returns void as
    $$
    declare
    	agevalue integer;
    begin
    	--ALTER TABLE personsample ADD COLUMN recodedage varchar(10);
    	FOR agevalue IN SELECT age FROM personsample 
    	LOOP       
           	        IF agevalue between 0 and 9 THEN
    			update personsample set recodedage='[-10]';
    		ELSEIF agevalue between 10 and 19 THEN
    			update personsample set recodedage='[10-19]';
    		ELSEIF agevalue between 20 and 29 THEN
    			update personsample set recodedage='[20-29]';
    		ELSEIF agevalue between 30 and 39 THEN
    			update personsample set recodedage='[30-39]';
    		ELSEIF agevalue between 40 and 49 THEN
    			update personsample set recodedage='[40-49]';
    		ELSEIF agevalue between 50 and 59 THEN
    			update personsample set recodedage='[50-59]';
    		ELSEIF agevalue between 60 and 69 THEN
    			update personsample set recodedage='[60-69]';
    		ELSEIF agevalue between 70 and 79 THEN
    			update personsample set recodedage='[70-79]';
    		ELSEIF agevalue between 80 and 89 THEN
    			update personsample set recodedage='[80-89]';
    		ELSE 
    			update personsample set recodedage='[90+]';
    		END IF;
    	END LOOP;		
    end
    $$ LANGUAGE 'plpgsql';

    Cette fonction s'exécute sans problème. Mais quand je l'appelle et que j'affiche la table, la variable recodedage prend la même valeur pour toutes les lignes. Et à chaque fois que je réexécute la fonction, la variable prend une autre valeur (toujours unique). Bien sûr l'âge est différent à chaque ligne et devrait implquer différentes classes.

    Je ne comprends pas pourquoi. Est-ce un problème dans mes conditions ?

    Merci d'avance,

    Romain

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    il n'y a pas de clause where dans vos updates donc vous allez updater la table entière systématiquement.

    Sinon, si votre but c'est de traiter la table entière, pourquoi ne faites-vous pas qu'un update en utilisant un CASE .. WHEN ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update personsample set recodedage =
    case when agevalue BETWEEN 0 AND 9 then '[-10]'
    when agevalue BETWEEN 10 AND 19 then '[10-19]'
    ....
    else [90+]
    end;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut Résolu !
    Trop bien ça marche merci !!!
    Voici le code complet pour ceux que ça intéresse :
    Code pl/pgsql : 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
    create or replace function ageclassesfunction() returns void as
    $$
    begin
    	--ALTER TABLE person ADD COLUMN recodedage varchar(10);
    	UPDATE person SET recodedage =
    	case when age BETWEEN 0 AND 9 then '[-10]' 
    	when age BETWEEN 10 AND 19 then '[10-19]'
    	when age BETWEEN 20 AND 29 then '[20-29]'
    	when age BETWEEN 30 AND 39 then '[30-39]'
    	when age BETWEEN 40 AND 49 then '[40-49]'
    	when age BETWEEN 50 AND 59 then '[50-59]'
    	when age BETWEEN 60 AND 69 then '[60-69]'
    	when age BETWEEN 70 AND 79 then '[70-79]'
    	when age BETWEEN 80 AND 89 then '[80-89]'
    	else '[90+]'
    	end;	
    end
    $$ LANGUAGE 'plpgsql';

    Résolu !

    Bonne journée,

    Romain

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/05/2015, 12h08
  2. Recoder une variable avec l'opérateur contains
    Par 5natacha dans le forum Débutez
    Réponses: 10
    Dernier message: 25/05/2012, 17h04
  3. Réponses: 4
    Dernier message: 15/09/2011, 14h03
  4. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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