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 :

Exécuter un SELECT dans un CASE WHEN [12c]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut Exécuter un SELECT dans un CASE WHEN
    Bonjour à tous,

    Voilà, je cherche à écrire une requête en simple sql, me permettant d'exécuter une requête sous condition.
    J'ai pu le faire en pl/sql sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    declare
    v_heure_min varchar2(50);
    v_heure_max varchar2(50);
    v_req varchar2(400); 
     
    begin
    v_heure_min:='22:00';
    v_heure_max:='02:00';
     
    if v_heure_min<v_heure_max then
          v_req:='create table voirie.acc_temp_ok as select * from voirie.accident where heure between ''' ||  v_heure_min|| ''' and ''' ||v_heure_max ||'''';
    else
          v_req:='create table voirie.acc_temp_nok as select * from voirie.accident where heure between ''' ||  v_heure_min|| ''' and ''23:59''
          union all select * from voirie.accident where heure between ''00:00'' and '''||  v_heure_max ||'''' ;
    end if;
     
    execute immediate v_req;
     
    end;
    /

    Mais j'aimerai maintenant pouvoir l'écrire un peu sous cette forme, mais cette syntaxe ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
     CASE 
        WHEN '22:00'<'23:00' THEN (select * from voirie.accident where heure between '22:00' and '23:00')
        ELSE (select * from voirie.accident where heure between '22:00' and '23:59' union all select * from voirie.accident where heure between '00:00' and '02:00')
    END
    from dual;
    Je sais qu'il n'est pas correct d'écrire la requête en précisant les valeurs '22:00' et '23:00' (c'est un exemple), mais l'outil dans lequel elle va être insérée permettra de rentrer la valeur min (22:00) et la valeur max (23:00), saisi par l'utilisateur.

    J'ai l'erreur suivante : ORA-00913: trop de valeurs

    Je ne saisi pas le sens de cette erreur dans ce contexte.

    Pourriez-vous m'orienter vers une solution, ou me donner quelques pistes?
    Je vous remercie d'avance,

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Citation Envoyé par ceuce Voir le message
    J'ai l'erreur suivante : ORA-00913: trop de valeurs

    Je ne saisis pas le sens de cette erreur dans ce contexte.
    Une sous-requête utilise dans le cadre d'une expression CASE ne doit retourner qu'une seule valeur.

    Il suffit peut-être d'écrire la requête ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    select  * 
    from    voirie.accident
    where   :debut  < :fin
        and heure   between :debut  and :fin
    union all
    select  * 
    from    voirie.accident
    where   :debut  > :fin
        and heure   between :debut  and '23:59'
    union all
    select  * 
    from    voirie.accident
    where   :debut  > :fin
        and heure   between '00:00' and :fin
    ;
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    Merci al1_24!

    Je n'aurai jamais pensé l'écrire ainsi.

    Mais ça fonctionne parfaitement, donc un grand grand merci

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Dans Oracle il n'est quasiment jamais nécessaire de créer des tables à la volée en pl/sql. Tu peux ainsi créer ta table en sql*plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table voirie.acc_temp_ok as
    select * from voirie.accident
    where   ('&v_heure_min' < '&v_heure_max' and heure between '&v_heure_min' and '&v_heure_max')
         or ('&v_heure_min' >= '&v_heure_max' and (heure between '&v_heure_min' and '23:59' or heure between '00:00' and '&v_heure_max'));

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    Merci beaucoup vanagreg,

    En effet j'ai fait ainsi pour pouvoir vérifier le contenu de mon select, mais l'idée est bien juste de pouvoir faire un select

    En tous cas ta solution fonctionne également parfaitement et je la conserve également précieusement.
    Un grand merci!

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

Discussions similaires

  1. Clause SELECT dans un CASE WHEN THEN
    Par LudoV63 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 09/12/2019, 16h24
  2. CASE WHEN EXISTS impossible dans un SELECT ?
    Par ctobini dans le forum DB2
    Réponses: 7
    Dernier message: 03/05/2012, 08h10
  3. Réponses: 5
    Dernier message: 24/10/2008, 09h20
  4. Access et SELECT CASE WHEN dans requetes
    Par Orion01 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/12/2007, 11h24
  5. Réponses: 7
    Dernier message: 29/05/2007, 10h21

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