#1 Wed 15 March 2023 12:03
- Kiecane
- Participant actif
- Date d'inscription: 31 Oct 2021
- Messages: 91
insert into booléen
Bonjour,
Je souhaiterais réaliser un INSERT INTO de données provenant d'une couche shapefile (.shp) dans ma base de données Postgre/SQL. Certaines de mes colonnes contiennent des données avec les libellés 'oui' ou 'non' ou 'na' exclusivement. Je voudrais donc les intégrer sous la forme de booléens dans les colonnes de la table correspondante qui se trouve dans ma base.
J'ai rédigé un script de la forme suivante :
INSERT INTO mon_schema.ma_table_vide
(
id_table,
colonne1_table,
colonne2_table,
colonne3_table,
colonne4_table,
geom,
)
SELECT
id_shp,
colonne1_shp,
colonne2_shp
colonne3_shp,
colonne4_shp,
geom,
FROM
mon_schema.shp_import
En supposant que colonne2_shp et colonne3_shp soient des booléens (libellés 'oui', 'non', ou 'NA'), pourriez-vous m'indiquer comment procéder pour que le 'oui' de colonne2_shp soit associé à un true dans colonne2_table et ainsi de suite s'il-vous-plaît ? Je n'arrive pas à trouver de solutions, je suppose que mes erreurs sont liées au mauvais placement de mon WHERE : true WHERE mon_schema.colonne2_shp ='oui' OR false WHERE mon_schema.colonne2_shp ='non'.
Je vous remercie de votre compréhension,
Cordialement.
Hors ligne
#2 Thu 16 March 2023 09:04
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 994
Re: insert into booléen
Salut,
Je pense qu'il faut mettre un CASE dans la ligne du champ Booléen du SELECT :
Code:
CASE WHEN colonne2_shp = 'oui' THEN true WHEN colonne2_shp = 'non' THEN false WHEN colonne2_shp = 'NA' THEN NULL ELSE NULL END
Dans le contexte :
Code:
INSERT INTO mon_schema.ma_table_vide ( id_table, colonne1_table, colonne2_table, colonne3_table, colonne4_table, geom, ) SELECT id_shp, colonne1_shp, CASE WHEN colonne2_shp = 'oui' THEN true WHEN colonne2_shp = 'non' THEN false WHEN colonne2_shp = 'NA' THEN NULL ELSE NULL END, colonne3_shp, colonne4_shp, geom, FROM mon_schema.shp_import
Dernière modification par Sylvain M. (Thu 16 March 2023 09:05)
Sylvain M.
Hors ligne
#3 Thu 16 March 2023 09:38
- Kiecane
- Participant actif
- Date d'inscription: 31 Oct 2021
- Messages: 91
Re: insert into booléen
Bonjour,
Je vous remercie pour votre réponse précise et détaillée. J'ai ajouté la fonction LCASE() dans le script, soit LCASE(colonne2_shp) = 'oui' par exemple, mais cela me génère une erreur : ERROR: ERREUR: la fonction lcase(character varying) n'existe pas ; HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments. Vous devez ajouter des conversions explicites de type.
Je ne comprends pas vraiment la source de l'erreur étant donné que LCASE() est justement censée prendre en charge des caractères de type alphanumérique. Je voulais utiliser cette fonction au cas où la donnée renseignée par les personnes qui s'occupent de compléter les colonnes dans le shape aient fait des erreurs de saisies ou des différences majuscules / minuscules.
Auriez-vous une solution à m'apporter s'il-vous-plaît ?
Hors ligne
#4 Thu 16 March 2023 10:08
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1146
Re: insert into booléen
Bonjour,
la fonction lcase n'existe pas dans PostgreSQL, comme vous l'indique le message d'erreur. Vous pouvez la fonction lower() pour convertir une chaine de texte en casse minuscule.
Hors ligne
#5 Thu 16 March 2023 11:10
- Kiecane
- Participant actif
- Date d'inscription: 31 Oct 2021
- Messages: 91
Re: insert into booléen
Bonjour,
Je vous remercie, en effet cela a bien fonctionné. Par la même occasion, j'en profite pour demander si l'insertion des clés étrangères peut se faire en même temps dans le INSERT INTO. Jusqu'ici, je le faisais à la suite à ma première insertion que je vous ai présentée ci-dessus. Autrement dit, je réalisais une première insertion sous la forme (INSERT INTO etc.) qui incluait tous les champs n'étant pas des clés étrangères, puis un UPDATE pour insérer les valeurs de clés étrangères en lien avec les autres tables de ma bdd. Je rédigeais ce dernier UPDATE sous la forme suivante :
WITH jointure_shp_dic AS (
SELECT *
FROM mon_schema.shp_import
INNER JOIN mon_schema.table_dic
ON shp_parcelles_2022.libelle = table_dic.libelle
)
UPDATE
mon_schema.ma_table_vide
SET
fk_vide = jointure_shp_dic.id_dic
FROM
jointure_shp_dic
WHERE
ma_table_vide.id_shp = jointure_shp_dic.id
sachant que j'ai préalablement créé dans ma_table_vide un champ id_shp (que j'avais malencontreusement appelé id_table dans mon INSERT INTO précédent) et qui contient les id de la shape.
N'hésitez pas à m'indiquer si je ne suis pas claire dans mes explications.
Par conséquent, serait-il possible de réaliser l'insertion de l'ensemble des données de ma couche shape en une seule fois, et si oui, comment procéder pour les clés étrangères s'il-vous-plaît ?
Hors ligne
#6 Thu 16 March 2023 14:43
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1146
Re: insert into booléen
Oui, vous pouvez réaliser une jointure à la suite de votre SELECT pour pouvoir récupérer des informations d'autres tables.
Code:
INSERT INTO mon_schema.ma_table_vide ( id_table, colonne1_table, colonne2_table, colonne3_table, colonne4_table, geom, fk_vide ) SELECT id_shp, colonne1_shp, CASE WHEN colonne2_shp = 'oui' THEN true WHEN colonne2_shp = 'non' THEN false WHEN colonne2_shp = 'NA' THEN NULL ELSE NULL END, colonne3_shp, colonne4_shp, geom, id_dic FROM mon_schema.shp_import INNER JOIN mon_schema.table_dic ON shp_parcelles_2022.libelle = table_dic.libelle
Dernière modification par tumasgiu (Thu 16 March 2023 14:43)
Hors ligne
#7 Tue 21 March 2023 16:25
- Kiecane
- Participant actif
- Date d'inscription: 31 Oct 2021
- Messages: 91
Re: insert into booléen
Bonjour,
J'ai créé des jointures avec une structure similaire à celle que vous m'aviez indiquée ci-dessus et cela a bien fonctionné. Je vous remercie pour votre aide.
Hors ligne