Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POSTGRESQL] Fusionner deux colonnes en une seule

Sujet résolu
    15 octobre 2021 à 23:52:38

    Bonjour,

    Je cherche en vain à fusionner deux colonnes firstname + surname en finalname :

    -- Création de la table
    CREATE TABLE people(
    	id SERIAL PRIMARY KEY NOT NULL,
    	firstname VARCHAR(32) NOT NULL,
    	surname VARCHAR(32) NOT NULL
    );
    
    -- Peuplement de la table
    INSERT INTO
    	people
    VALUES
    	(1, 'Snow', 'The Hero'),
    	(2, 'Lightning', 'The Soldier'),
    	(3, 'Sazh', 'The Gunfighter'),
    	(4, 'Vanille', 'The Medic');
    
    -- Fusion de la colonne firstname avec surname
    SELECT firstname || ' ' || surname FROM people;
    
    ALTER TABLE people
    	ADD COLUMN finalname
    	-- Résultat de SELECT firstname || ' ' || surname FROM people
    	-- à enregistrer dans la nouvelle colonne finalname
    	DROP COLUMN firstname, surname; -- Erreur de syntaxe ?

    Le problème est que :

    • J'obtiens une erreur de syntaxe lorsque j'essaie de faire un DROP COLUMN firstname, surname
    • Je n'arrive pas à exprimer en SQL comment concaténer deux colonnes et récupérer le résultat de cette concaténation dans une nouvelle colonne ?

    Merci d'avance pour votre aide

    -
    Edité par Valenciano 16 octobre 2021 à 0:18:52

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

      16 octobre 2021 à 0:29:48

      Après ton insertion avec les 2 colonnes présentes.

      1/ Ajouter la colonne finalname avec DEFAUT '' car si tu mets NOT NULL, il se pourrait que tu aies une erreur puisque des valeurs sont  déjà insérées. Tu aurais une 4ème colonne avec du texte vide ;

      2/ Faire un UPDATE avec une requête qui dit :

      POUR chaque ligne FAIRE :
        concaténer firstname, ' ', surname
        mettre la valeur concaténée dans fullname

      3/ Supprimer les 2 colonnes.

      L'erreur de syntaxe est peut-être dûe au fait qu'ALTER TABLE ne peut faire qu'une seule chose, ici, tu en fais 2, tu ajoutes une colonne puis tu en supprimes une autre.

      Pour récupérer le résultat et donc le stocker dans une variable, tu peux lire ça.

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2021 à 13:35:25

        Bonjour,

        Je sais que je ne réponds pas à la question, mais il est inutile de fusionner ces 2 colonnes, vu que tu peux obtenir la forme voulue avec un SELECT ...

        C'est une rupture de la forme normale ...

        -
        Edité par Benzouye 16 octobre 2021 à 13:35:36

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          16 octobre 2021 à 14:24:49

          Merci à tous pour vos réponses,

          J'ai fini par trouver grâce à vos conseils :

          DROP TABLE IF EXISTS people;
          
          -- Création de la table
          CREATE TABLE people(
              id SERIAL PRIMARY KEY NOT NULL,
              firstname VARCHAR(32) NOT NULL,
              surname VARCHAR(32) NOT NULL
          );
           
          -- Peuplement de la table
          INSERT INTO
              people
          VALUES
              (1, 'Snow', 'The Hero'),
              (2, 'Lightning', 'The Soldier'),
              (3, 'Sazh', 'The Gunfighter'),
              (4, 'Vanille', 'The Medic');
           
          -- Ajout d'une colonne finalname
          ALTER TABLE people
          ADD COLUMN finalname VARCHAR(32);
          
          -- Peuplement par defaut de la colonne finalname
          ALTER TABLE people
          ALTER COLUMN finalname SET DEFAULT '';
              
          -- Fusion de la colonne firstname avec surname
          UPDATE people
          SET finalname = firstname || ' ' || surname;
          
          -- Supprimer les colonnes firstname et surname
          ALTER TABLE people
          DROP COLUMN firstname,
          DROP COLUMN surname;
          
          SELECT * FROM people;

          Ce qui est un peu perturbant c'est qu'au final en SQL le "FOREACH ROW in TABLE" est plus ou moins implicite puisqu'il se fait par défaut ici :

          -- Fusion de la colonne firstname avec surname
          UPDATE people
          -- Pour chaque ligne de la table people, attribuer à finalname la concaténation de firstname + surname
          SET finalname = firstname || ' ' || surname;



          -
          Edité par Valenciano 16 octobre 2021 à 14:25:56

          • Partager sur Facebook
          • Partager sur Twitter

          Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

          [POSTGRESQL] Fusionner deux colonnes en une seule

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown