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

SQL Oracle Discussion :

Decode return null


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut Decode return null
    Bonjour à tous.

    J'essaye de faire une requête du genre.

    Select decode((select 'nom' from dual),'n','nom existe',(select 'bla' from dual where 1=2)) from dual.

    Mon gros soucis est que decode va me retourner null alors que j'aimerai qu'il me retourne la même valeur que si je faisais un select 'bla' from dual where 1=2 à savoir un rowset vide.

    Je suppose que c'est une caractéristique de decode de retourner null.... Mais est-ce que qqn aurait une idée de requête qui me permettrai d'avoir à la fois la possibilité de faire des conditions et de ne rien retourner s'il ne trouve rien?


    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bonjour.

    Tu as essayé de mettre ''? (2 cotes simples sans espace)

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    malheureusement oui et sans succès

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Pour quelle raison veux-tu que cela ne te retourne rien? Pour que ça plante?
    N'y a-t-il pas un moyen plus simple de gérer cela?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le comportement est normal puisqu'il y a une ligne dans la table dual, ça n'a rien à voir avec decode.

    Si vous ne voulez pas de ligne, il faut filtrer avec un prédicat faux dans le where.

    Pouvez-vous "mieux" expliquer votre problématique globale car ça semble obscur et j'aimerai comprendre dans quel cas on veut ne pas avoir de résultat.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le comportement est normal puisqu'il y a une ligne dans la table dual, ça n'a rien à voir avec decode.

    Si vous ne voulez pas de ligne, il faut filtrer avec un prédicat faux dans le where.

    Pouvez-vous "mieux" expliquer votre problématique globale car ça semble obscur et j'aimerai comprendre dans quel cas on veut ne pas avoir de résultat.
    Classiquement, c'est pour avoir simplement les métadonnées (noms des colonnes, types, etc.), et ça se fait effectivement avec par exemple un WHERE 1 = 0.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    Alors justement, voilà mon point et ma question.

    Si on reprend le petit exemple sql que j'ai donné,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select decode((select 'nom' from dual),'n','nom existe', (select 'bla' from dual where 1=2)) 
    from dual
    Cette requête va me retourner 'null'. Pourquoi? parce que quand j'execute:

    select 'nom' from dual va me retourner 'nom' qui n'est pas égal à 'n', donc il ne va pas m'afficher 'nom existe', mais (select 'bla' from dual where 1=2). Hors si j'execute (select 'bla' from dual where 1=2) sans décode, il me retourne le résultat escompté à savoir no rows. Mais vu qu'il est dans le decode, il m'affiche 'null'.

    D'ailleurs si je transforme mon code de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select decode((select 'nom' from dual where 1=2),'n','nom existe',(select 'bla' from dual where 1=2)) 
    from dual;
    Le résultat est le même, à savoir null.

    Est-ce que c'est plus clair?

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    OK, mais tu voudrais quoi ?

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par gibono Voir le message
    Hors si j'execute (select 'bla' from dual where 1=2) sans décode, il me retourne le résultat escompté à savoir no rows. Mais vu qu'il est dans le decode, il m'affiche 'null'.
    Non, c'est parce qu'il est imbriqué dans un autre "select ... from dual".
    Decode n'a rien à voir avec le nombre de résultat de votre requête.

    Si vous faites la requête suivante vous n'aurez pas de résultat et pourtant il y a un decode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select decode(<cequevouvoullez>) from dual where 1= 0

  10. #10
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    J'aimerai qu'il me retourne:

    All Rows Fetched: 0

    et pas

    All Rows Fetched: 1 (avec mon fameux 'null' comme row)

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Restreindre le nombre de lignes se fait avec le WHERE. Tu peux mettre tout ce que tu veux dans ton DECODE, ça ne changera le nombre de lignes renvoyées.

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Ce n'est toujours pas clair...
    Comment récupères-tu le résultat de la requête?

  13. #13
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    Waldar je comprends votre incompréhension

    J'ai donné cet exemple, car dans mon exemple concret, il se peut qu'il y ait un résultat avec le premier select ou un avec le deuxième ou rien. Si j'ajoute la clause where 1=2 en dehors comme vous le proposez, je n'aurai jamais aucun résultat. Mais je pense que vous m'avez mis sur la bonne voix. Il faudrait que je puisse faire une requête dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT decode(<cequevouvoullez>) t FROM dual WHERE (t is not null)
    Mais dans ce cas, il me dit que t est un invalid identifier. Une idée?

  14. #14
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    Alors effectivement, je pense que c'est la bonne piste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT decode((SELECT 'nom' FROM dual),'n','nom existe', (SELECT 'bla' FROM dual WHERE 1=2)) 
    FROM dual
    where (decode((SELECT 'nom' FROM dual),'n','nom existe', (SELECT 'bla' FROM dual WHERE 1=2))) is not null
    ça marche très bien, mais bonjours les performances car la requête est surement exécutée 2 fois... y a-t-il un moyen de faire plus propre?

    En tout cas, j'ai un truc qui marche, c'est déjà un premier 'merci infiniment'

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Tu peux faire un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM (
      SELECT decode(<cequevouvoullez>) t 
      FROM dual 
    ) derivee
    WHERE t IS NOT NULL
    de là à dire que c'est plus propre...

  16. #16
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Par défaut
    Pour moi ça l'est, déjà d'un point de vue de lisibilité.

    Merci infiniment pour votre solution, vous m'enlevez une belle épine.


  17. #17
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Il existe depuis maintenant plusieurs années CASE WHEN beaucoup plus lisble qui rend obsolète le DECODE.

    Sinon autant que possible si on a besoin de sous-requête on les mets au niveau du FROM principal mais de préférence jamais au niveau du SELECT, ceci pour ne pas exécuter n fois la même requête.

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

Discussions similaires

  1. subreport return null
    Par khili dans le forum Langage
    Réponses: 0
    Dernier message: 21/05/2011, 16h53
  2. [Security] HttpSession returned null object for ACEGI_SECURITY_CONTEXT
    Par Elmour dans le forum Spring
    Réponses: 0
    Dernier message: 05/03/2009, 14h25
  3. GetDlgItem return NULL pointer
    Par karim2009 dans le forum Visual C++
    Réponses: 33
    Dernier message: 09/02/2009, 18h45
  4. getNamespaceURI return null
    Par *alexandre* dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 03/10/2007, 14h23
  5. Pointeur intelligent boost : return NULL ->comment faire?
    Par choinul dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 21/12/2005, 16h24

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