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 :

Utiliser une nested query dans un CASE statement [11g]


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut Utiliser une nested query dans un CASE statement
    Bonsoir,

    Je vais essayer de présenter mon problème par des exemples :

    Nous sommes en novembre 2014, donc en écrivant la query suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_char(sysdate, 'MM')||','||to_char(sysdate, 'YY') test_id FROM DUAL
    J'obtiens
    Imaginons la query suivante à présente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CASE 
           WHEN to_char(11) IN (11,14) THEN 'okok bon' 
           ELSE 'pas bon' END
    FROM DUAL
    Elle me retourne évidemment
    Là, où je veux en venir, c'est pourquoi si je remplace le 11,14 par la première query que j'ai écrite dans ce post, ça ne me retourne 'pas bon' ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CASE 
           WHEN to_char(11) IN (SELECT to_char(sysdate, 'MM')||','||to_char(sysdate, 'YY') test_id FROM DUAL) THEN 'okok bon' 
           ELSE 'pas bon' END
    FROM DUAL
    pareil si je le fais comme çà (ce qui est en fait mon objectif final).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CASE 
           WHEN to_char(11) IN (test_id) THEN 'okok bon' 
           ELSE 'pas bon' END
    FROM (SELECT to_char(sysdate, 'MM')||','||to_char(sysdate, 'YY') test_id FROM DUAL)
    Je souhaiterai écrire une query comme cette dernière où le test_id est repris dans le IN (test_id).
    J'ai évidemment simplifié mon problème pour vous le présenter ici, mais je ne comprends pas pourquoi avec ma query qui me retourne 11,14, ça ne me permet de tourner cette grande query...

    Quelqu'un sait m'éclairer et pourquoi pas aussi me donner la solution pour que ça me retourne le résultat correct ? Merci beaucoup
    J'ai déjà essayé avec des to_char, to_number, des apostophes à plusieurs edroits, etc. mais rien n'y fait, je ne trouve pas le moyen d'avoir le 'okok bon' comme résultat.

    Merci pour votre aide... J'suis bloqué

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par h12enri Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CASE 
           WHEN to_char(11) IN (SELECT to_char(sysdate, 'MM')||','||to_char(sysdate, 'YY') test_id FROM DUAL) THEN 'okok bon' 
           ELSE 'pas bon' END
    FROM DUAL

    Ce que j'ai compris, Tu veux élaborer un ensemble de données qui te permet de les exploiter en utilisant un IN .
    Par contre,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select to_char(sysdate, 'MM')||','||to_char(sysdate, 'YY') from dual
    ne donne pas en issu un ensemble, mais c'est une simple concaténation qui
    te donne la chaine de caractères '11,14'
    Pour avoir un ensemble, tu met directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IN( to_char(sysdate, 'MM') ,to_char(sysdate, 'YY'))


    le code est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CASE 
           WHEN to_char(11) IN( to_char(sysdate, 'MM') ,to_char(sysdate, 'YY')) THEN 'okbon'
           ELSE 'pasbon' end
    FROM dual 
     
     
    Sinon, s itu veux concrétiser ton idée pour raison d'apprentissage, tu met union de deux select comme ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CASE 
           WHEN to_char(11) IN(select to_char(sysdate, 'MM') from dual
                               union
                               select to_char(sysdate, 'YY') from dual) THEN 'okbon'
           ELSE 'pasbon' end
    FROM dual
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Salut islamov2000,

    Merci pour ta réponse.
    Effectivement, tu l'as bien compris, je veux exploiter le résultat d'une query dans le IN.

    Je me demande si je n'ai pas trop simplifié le problème en le présentant ici. J'ai voulu aller à l'essentiel pour ne pas influencer le lecteur par les petits à côtés.

    Voilà la partie de ma query en réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
    CASE
     WHEN to_char(a.aliquot_id) IN (alkid) THEN 'µS pH alkalinity,'||to_char(order+2)||','||a.name
     WHEN NOT to_char(a.aliquot_id) IN (alkid) THEN 'µS pH,'||to_char(order+2)||','||a.name END
    FROM worksheet_entry we,
    aliquot a,
    (SELECT listagg(t.aliquot_id,',') WITHIN GROUP (ORDER BY we.worksheet_order) ALKID, worksheet_id  WID FROM worksheet_entry we,test t WHERE we.aliquot_id=t.aliquot_id AND t.test_template_id IN(10,530)AND worksheet_id=21029 GROUP BY worksheet_id) FULL
     
    WHERE we.aliquot_id = a.aliquot_id AND full.wid = we.worksheet_id AND worksheet_id = 21029
    Evidemment, dans mon post précédent je simplifiais en ayant que 2 valeurs comme réponse (11 et 14), mais en réalité j'ai des dizaines de réponses venant de la query FULL, et jamais le même nombre bien sûr. Donc je ne sais pas comment écrire la query puisque dans l'exemple que tu me proposes, tu écris 2 petites query que tu UNION parce que qu'on parlait de 11 et 14 dans mon exemple. Mais quand je ne sais pas de combien de réponses il va s'agir, je ne sais pas comment l'écrire...

    Tu penses à quelque chose de différent ? En tout cas, déjà merci d'avoir cerné le problème, je comprends mieux, même si ça n'a pas résolu mon souci jusqu'ici

    Henri

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Dans le cas, tu mets dans l'ensemble de IN un SELECT avec les conditions que veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...IN (select col from la_table where les conditions)

    Avec un jeu de données et le résultat souhaité, ça sera mieux.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Salut,

    ok je prends
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    CASE
     WHEN to_char(a.aliquot_id) IN (SELECT DISTINCT t.aliquot_id FROM worksheet_entry we,test t WHERE we.aliquot_id=t.aliquot_id AND t.test_template_id IN(10,530)AND worksheet_id=21029) THEN 'µS pH alkalinity,'||to_char(worksheet_order+2)||','||a.name||',NA4P,100,ml'
     WHEN NOT to_char(a.aliquot_id) IN (SELECT DISTINCT t.aliquot_id FROM worksheet_entry we,test t WHERE we.aliquot_id=t.aliquot_id AND t.test_template_id IN(10,530)AND worksheet_id=21029) THEN 'µS pH,'||to_char(worksheet_order+2)||','||a.name||',NA4P,100,ml' END ANA
    FROM worksheet_entry we, aliquot a
    WHERE we.aliquot_id = a.aliquot_id AND worksheet_id = 21029
    En fait, je cherchais à ne pas devoir écrire la query entre les parenthèses du IN pour ne pas avoir à la répéter (parce que j'ai un nombre limité de caractères). Donc je pensais qu'en la mettant de le FROM je pourrai en faire appel mais il semble que non.
    Cependant, même en mettant la query dans le IN (...) je suis en dessous de ma limite. Donc ça me convient, merci

    J'aurai tout de suite du le faire comme ça en fait, mais je ne pensais pas que je parviendrai en dessous de la limite quand j'ai commencé.

    Bon dimanche, merci

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Tu mets le ELSE de CASE pour ne pas compliquer la requête, et en pensant au temps d'exécution.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Effectivement, seulement j'ai 3 autres WHEN dans mon CASE, ici je n'en présentais que les 2 qui me posaient souci

    Merci pour toute ton aide !

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

Discussions similaires

  1. Utiliser une boucle "For" dans un" Select Case"
    Par Novice_vba dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/04/2014, 09h34
  2. [JAR][POLICE] Utiliser une police ttf dans un fichier jar
    Par Doc.Fusion dans le forum Général Java
    Réponses: 3
    Dernier message: 26/01/2005, 12h23
  3. [jre]utiliser une autre vm dans eclipse
    Par champion dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 02/07/2004, 11h21
  4. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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