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

Langage SQL Discussion :

remplacer un "no rows selected" par une valeur


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut remplacer un "no rows selected" par une valeur
    Bonjour,

    c'est un peu la suite de mon pb d'hier. j'ai des requètes SQL qui sont parsées par un pg PRO*C dont l'interface est non modifiable.
    Quelles que soient les requètes, elles doivent renvoyer des valeurs : si no rows alors le tuple ('',0).
    Jusqu'à présent, avec des max et des decode, j'arrivais à m'en sortir.
    mais avec la requète suivante, j'ai un comportement étrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select point_name,maxi from 
    (select point_name,cnt,MAX(cnt) over() as maxi from
              (select point_name,count(*) as cnt from ops$ope.lev_app_cond where AIRPORT_NAME is not null group by POINT_NAME) 
    ) 
    where cnt=maxi;
    Dans le cas ou il n'y a pas de réponse, la requète renvoie "no rows ...".
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(point_name),max(decode(maxi,null,0,maxi)) ...
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MAX(P MAX(DECODE(MAXI,NULL,0,MAXI))
    ----- -----------------------------
    Je mattendais à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MAX(P MAX(DECODE(MAXI,NULL,0,MAXI))
    ----- -----------------------------
                            0
    Sinon comment faire ?

    Merci

  2. #2
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    J'ai bien trouver un moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT point_name,maxi FROM 
    (SELECT point_name,cnt,MAX(cnt) over() AS maxi FROM
              (SELECT point_name,count(*) AS cnt FROM ops$ope.lev_app_cond 
    WHERE AIRPORT_NAME IS NOT NULL GROUP BY POINT_NAME) 
    ) 
    WHERE cnt=maxi
    union all
    select '',0 from dual 
    where not exists (SELECT point_name,count(*) AS cnt FROM 
    ops$ope.lev_app_cond WHERE AIRPORT_NAME IS NOT NULL GROUP BY POINT_NAME)
    Mais la sous requète va être exécuter deux fois! Cela ne me semble pas bien performant.
    merci

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 118
    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 118
    Points : 28 510
    Points
    28 510
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Mais la sous requète va être exécuter deux fois! Cela ne me semble pas bien performant.
    Comme ça, c'est bien suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    where not exists (SELECT 1 FROM 
    ops$ope.lev_app_cond WHERE AIRPORT_NAME IS NOT NULL)

  4. #4
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    En fait, la requête suivante renvoie ce que j'attends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT max(point_name),decode(max(maxi),null,0,max(maxi)) FROM 
    (SELECT point_name,cnt,MAX(cnt) over() AS maxi FROM
              (SELECT point_name,count(*) AS cnt 
               FROM ops$ope.lev_app_cond 
               WHERE AIRPORT_NAME IS NOT NULL GROUP BY POINT_NAME) 
    ) 
    WHERE cnt=maxi;
    Cela me semble plus compact.

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

Discussions similaires

  1. Remplacer des select imbriqués par une jointure
    Par comode dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/11/2011, 15h01
  2. un SELECT borné par une variable JS
    Par rragnarok dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 04/09/2007, 06h15
  3. Réponses: 3
    Dernier message: 11/12/2005, 12h15
  4. Réponses: 1
    Dernier message: 10/12/2005, 00h34

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