banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 995

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: 1160

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: 1160

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

 

Pied de page des forums

Powered by FluxBB