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 : 25
    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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 643
    Points : 23 441
    Points
    23 441

    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

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 638
    Points : 16 387
    Points
    16 387

    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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 643
    Points : 23 441
    Points
    23 441

    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

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 638
    Points : 16 387
    Points
    16 387

    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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 643
    Points : 23 441
    Points
    23 441

    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 : 25
    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 ?

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