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

Requêtes PostgreSQL Discussion :

Requête SQL CASE WHEN THEN ESLE


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Requête SQL CASE WHEN THEN ESLE
    Bonjour,

    Je débute en SQL, je souhaite mettre a jour un champs 'verif' a partir de la géométries de deux shapes, ce sont deux shape de points et je souhaite savoir si ils sont au meme emplacement geometrique ou non ( a mon avis la formule que j'utilise n'est pas bonne, je dois utiliser un ST_Equals(geom A, geom B) ?)

    J'ai ce code SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE testjessy."54_028_380_BOITE_OPTIQUE_A1"
    SET verif = (CASE 
                 WHEN ("54_028_380_BOITE_OPTIQUE_A1".geom = "54_028_380_POINT_TECHNIQUE_A1".geom)
                 THEN 'true'
                 ELSE 'false'
                 END)
    Ce code ci fonctionne correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT nom FROM testjessy."54_028_380_BOITE_OPTIQUE_A1", testjessy."54_028_380_POINT_TECHNIQUE_A1"
    						where ST_equals("54_028_380_BOITE_OPTIQUE_A1".geom,"54_028_380_POINT_TECHNIQUE_A1".geom)
    Pouvez-vous me guider ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE  testjessy."54_028_380_BOITE_OPTIQUE_A1" opt
    SET verif = CASE 
                    WHEN EXISTS    
                            (   SELECT  NULL
                                FROM    testjessy."54_028_380_POINT_TECHNIQUE_A1"   tch
                                WHERE   ST_equals(opt.geom, tch.geom)
                            )
                        THEN 'true'
                    ELSE 'false'
                 END
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Peut-être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        update "54_028_380_BOITE_OPTIQUE_A1"
           set verif  = case when tch.geom is null then 'false' else 'true' end
          from testjessy."54_028_380_BOITE_OPTIQUE_A1"   as opt
     left join testjessy."54_028_380_POINT_TECHNIQUE_A1" as tch on ST_equals(opt.geom, tch.geom);

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Ta solution est intéressante mais la table cible ne doit pas apparaître dans la clause FROM sauf en cas d'autojointure, auquel cas elle aura son propre alias.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Effectivement la syntaxe n'a pas l'air valide chez PostGreSQL.

    Sinon on peut toujours faire deux mises à jour, mais il doit y avoir plus performant.
    J'essaie de contourner le EXISTS dans le CASE, côté optimiseur ça sort - je pense - en un full table scan pour chaque ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- Initialisation des status
    update testjessy."54_028_380_BOITE_OPTIQUE_A1"
       set  verif  = 'false'
     where (verif <> 'false'
        or  verif is null);
     
    -- Mise à jour des "vrais"
    update testjessy."54_028_380_BOITE_OPTIQUE_A1" as opt
       set verif  = 'true'
     where verif <> 'true'
       and exists (select null
                     from testjessy."54_028_380_POINT_TECHNIQUE_A1" as tch
                    where ST_equals(opt.geom, tch.geom));
    Enfin tout ça c'est à tester.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update  testjessy."54_028_380_BOITE_OPTIQUE_A1" as tgt
    set     verif  = case when tch.geom is null then 'false' else 'true' end
    from    testjessy."54_028_380_BOITE_OPTIQUE_A1"   as opt
        left join 
            testjessy."54_028_380_POINT_TECHNIQUE_A1" as tch 
            on  ST_equals(opt.geom, tch.geom)
    where   opt.unique_id = tgt.unique_id
    --  where   ST_equals(opt.geom, tgt.geom) -- si testjessy."54_028_380_BOITE_OPTIQUE_A1" n'a pas d'identifiant unique 
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci Beaucoup, ça fonctionne nikel !

    J'ai une autre problematique, j'ai deux shape de type polygone un ZASRO (Zone arrière de SRO) et ZAPBO (Zone Arrière de PBO) , la ZASRO contient plusieurs ZAPBO.
    La ZASRO a un champs 'code_sro' de forme "SRO-54-028-380"
    La ZAPBO a un champs 'code_pbo' de forme "PBO-54-028-380-1135"

    J'aimerais mettre a jour a champs 'verif' dans le shape 'ZAPBO' qui me m'indique la bonne codification de ma ZAPBO,
    c'est a dire que lorsque j'ai une ZAPBO qui se trouve dans une ZASRO "SRO-54-028-380" avec les digit "54-028-380" mon code de ZAPBO doit être du meme digit "54-028-380".
    Je pense qu'il faut utiliser une condition INTERSECT et un une fonction qui compte a partir du nieme caractère, ici a partir du 4eme.

    Vous avez des idées ?

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

Discussions similaires

  1. Hibernate HQL : CASE WHEN THEN
    Par hisoft dans le forum Autres
    Réponses: 3
    Dernier message: 12/04/2011, 21h31
  2. SQL Case When
    Par mechatikhaled dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/01/2009, 16h57
  3. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  4. Transact SQL : case when
    Par dianouch dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2006, 12h12
  5. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 08h23

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