#1 Wed 25 July 2018 17:42
- alexandra21
- Juste Inscrit !
- Date d'inscription: 25 Jul 2018
- Messages: 7
Utiliser Insert into...
Bonjour à vous,
INSERT INTO schema.table_new (col1, col2, col3) SELECT col1, col3, col4 FROM schema_temp.table_old ;
Lors de l'insertion des lignes issues de la table_old vers la table_new, je me trouve confontrée au problème que le type de données de la col3 de la table_old n'est pas le même que celui déclaré pour la col2 de la table_new. En effet, je souhaiterais que les valeurs prises par la col3 de la table_old soit modifiées en acronymes lors de leur insertion dans la col2 de la table_new.
A votre écoute si quelqu'un a une solution,
Je vous remercie par avance pour votre aide,
Hors ligne
#2 Wed 25 July 2018 18:00
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: Utiliser Insert into...
Sous réserve d'avoir bien compris :
Si vous souhaitez extraire par exemple les 3 premiers caractères de chaque valeurs en guise d'acronyme :
Code:
INSERT INTO schema.table_new (col1, col2, col3) SELECT col1, substring(col3 from 0 for 3), col4 FROM schema_temp.table_old ;
Si vous voulez gerer vos acronymes en fonction de chaque valeur :
Code:
INSERT INTO schema.table_new (col1, col2, col3) SELECT col1 , CASE WHEN col3 = 'aaaaaa ' THEN 'AAA' WHEN col3 = 'bbbbbbb ' THEN 'BBB' WHEN col3 = 'ccccccccc ' THEN 'CCC' ELSE 'ZZZ' END ,col4 FROM schema_temp.table_old ;
En attendant une meilleurs solution ...
Hors ligne
#3 Wed 25 July 2018 18:03
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Utiliser Insert into...
Bonjour,
Dans le select, vous pouvez utiliser les fonctions SQL de votre choix: si vous avez des opérations a faire sur col3, ecrivez-les dans la partie select.
Qu'entendez-vous par "modifiées en acronymes" ? prendre juste la premiere lettre de chaque mot ?
Surtout, quels sont les types de données des colonnes de la table_new et table_old ?
Par ex, pour prendre la premiere lettre de chaque mot:
Code:
with table_old as ( select * from (values (1, 'electricite de france'), (2, 'Paris Saint Germain'), (3, 'france telecom'), (4, 'mort de rire')) as t(id, col3) ), first_letter as ( select id, upper(left(unnest(regexp_split_to_array(col3, ' ')), 1)) as letter from table_old ) select id, string_agg(letter, '') as acronyme from first_letter group by id order by id; id acronyme 1 EDF 2 PSG 3 FT 4 MDR
(il doit y avoir plus simple avec des regexp.)
Nicolas
Hors ligne
#4 Wed 25 July 2018 18:21
- alexandra21
- Juste Inscrit !
- Date d'inscription: 25 Jul 2018
- Messages: 7
Re: Utiliser Insert into...
Je vais opter pour le code de Ben22 pour le moment
Pour répondre à Nicolas, c'est bien prendre la 1ère lettre de chaque mot et les types de données sont : varchar(50) pour table_old et varchar(3) pour table_new.
Merci à tous les deux,
Hors ligne
#5 Wed 25 July 2018 18:39
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Utiliser Insert into...
Si vous avez bcp de données dans la table, vous allez vous amuser pour écrire le select ! une ligne à écrire par ligne de la table.
Si vous rajoutez des données dans la table_old, vous devrez réécrire la requete à chaque fois.
Nicolas
Hors ligne
#6 Fri 27 July 2018 11:26
- alexandra21
- Juste Inscrit !
- Date d'inscription: 25 Jul 2018
- Messages: 7
Re: Utiliser Insert into...
Je n'ai que 5 catégories d'acronyme pour ce champ et il est peu probable que cela évolue donc dans un premier temps le code me convient bien.
Il est vrai que votre code sera plus pertinent si j'ai un champ avec plus de données à modifier....ce qui sera forcement le cas !!
Hors ligne