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

Oracle Discussion :

[ORACLE 8i]Decode dans WHERE


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut [ORACLE 8i]Decode dans WHERE
    Bonjour à toutes et à tous,

    Je travail sur une réquête dans laquelle il faudrait que je filtre en fonction d'un paramétre et de sa valeur afin d'inclure dans la clause WHERE un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ....
    WHERE
           (FAC."ExeFac"=SUI.FAEXE(+) AND FAC."NumFact"=SUI.FANFAC(+))
     AND   (FAC."NumEng"=KENG.ENNO(+) AND FAC."ExeEnga"=KENG.ENEXE(+))
     AND   decode('&&PARAM1',null,SUI.DEST LIKE '%%',SUI.DEST = UPPER('&&PARAM1'))
    Est ce possible ? Il y a-t-il d'autres solutions ? Ou pourquoi ma requête ne passe pas ?

    Merci d'avance pour vos interventions/réponses.

    Jérémy

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Et pourquoi pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE
           (FAC."ExeFac"=SUI.FAEXE(+) AND FAC."NumFact"=SUI.FANFAC(+))
     AND   (FAC."NumEng"=KENG.ENNO(+) AND FAC."ExeEnga"=KENG.ENEXE(+))
     AND   ( 
    '&&PARAM1'  IS null OR SUI.DEST LIKE '%%' OR SUI.DEST = UPPER('&&PARAM1')
            )

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour Fred_D,

    Parce que :
    - si &&PARAM1 est nul , c'est que l'utilisateur à laissé un champs facultatif vide et qu'il faut que je raméne toutes les données .
    - si &&PARAM1 n'est pas nul, c'est qu'il contient une valeur qui peut être par exemple : EST , WEST, ENT, CENT, etc...

    J'étais passé par un :
    Malheuresement, dans ce cas , si &&PARAM1='EST', la réquête va me ramener les valeurs de WEST aussi...

    Vous voyez mieux mon soucis ?

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    J'ai pas bien saisi désolé mais un DECODE ne fait que du OR finalement alors il y a moyen de s'en sortir en adaptant mon exemple sans aucun doute

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Fred_D
    J'ai pas bien saisi désolé mais un DECODE ne fait que du OR finalement alors il y a moyen de s'en sortir en adaptant mon exemple sans aucun doute
    En fait il me faudrait pouvoir tester la valeur de &&PARAM1 :
    si &&PARAM1 = null alors ...
    sinon ....

    C'est pour cela que je suis passé par un decode ... Je fais fausse route ?

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    alors quoi ? et sinon quoi ?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Fred_D
    alors quoi ? et sinon quoi ?
    Bon ok, on reprend depuis le début :

    Voilà l'intégratlité de ma requête :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    spool /usr1/lw/edt/FACSB.txt
     
    SET TERM OFF 
    COL today NOPRINT NEW_VALUE today 
    SELECT sysdate today FROM dual; 
    SET TERM ON
     
    set pages 3000
    set lines 132
    set verify off
    set feedback off
     
    TTITLE CENTER'*** EDITION DES FACTURES ENREGISTREES DEPUIS LE << &&PARAM2 >> ET NON MANDATEES.***' - 
    SKIP 3 -
    'Edité le &today' -
    skip 3    
     
    Select FAC."Ty",
           FAC."DateRecep",
           FAC."NumFact", 
           FAC."MtTTC", 
           FAC."NumFo/Tiers",  
            CASE WHEN FAC.Fattier = 'F'
    	 THEN (Select T.fnfo from kfourni T where FAC."NumFo/Tiers"=T.fcfo AND FAC.SCSO=T.SCSO)
    	 ELSE (Select Ti.tinom from ktiers Ti where FAC."NumFo/Tiers"=Ti.ticod AND FAC.SCSO=Ti.SCSO)
           END as "Four/Tiers",   
           FAC."NumEng", 
           FAC."ExeEnga", 
           FAC."TE",
           SUI.dest,
           KENG.Pecodop "Nom" 
    FROM (SELECT decode(F.fatype, 'F','Fa','A','Av','R','R') "Ty", 
            lpad(F.fadrec,9,' ') "DateRecep",
             F.FAEXE "ExeFac",	
             F.fanfac "NumFact", 	
             nvl(F.famtht,0)-nvl(F.faremi,0)+nvl(F.fatva,0) "MtTTC", 
             F.factier "NumFo/Tiers", 
             F.fanoeng "NumEng", 
             F.enexe "ExeEnga" , 
             decode(F.faceo,'B','BT','O','OS','C','Cde') "TE",
             F.FATTIER,
             F.SCSO
           FROM KSAIFAC F
           WHERE (F.VALID IS NULL)
                 AND ((F.fadrec >= DECODE('&&PARAM2',null,'01-JAN-00','&&PARAM2')) or F.fadrec is null )
           ) FAC,
           (SELECT 
              FACSUI.dest, 
              FACSUI.FAEXE, 
              FACSUI.FANFAC
            FROM KSBSUIFA FACSUI
            WHERE FACSUI.ROWID = (SELECT MAX(FACSUI2.ROWID) 
    		              FROM KSBSUIFA FACSUI2
                                  WHERE (FACSUI.FANFAC=FACSUI2.FANFAC AND FACSUI.FAEXE=FACSUI2.FAEXE))
    	      		     ) SUI,
         (SELECT 
           Pecodop, 
           enno, 
           enexe 
          FROM KPERSONL K,
               KVENG ENG 
          WHERE ENG.PEC=K.PEC) KENG 
    WHERE
           (FAC."ExeFac"=SUI.FAEXE(+) AND FAC."NumFact"=SUI.FANFAC(+))
     AND   (FAC."NumEng"=KENG.ENNO(+) AND FAC."ExeEnga"=KENG.ENEXE(+)) 
     AND   (SUI.dest like UPPER('%&&PARAM1%'))
    ORDER BY 3
    /
    spool off
    ho /usr1/lw/bin/mt_facstandby.sh &&PARAM1
    Comme tu peux voir pour l'instant j'utilise &&PARAM1 dans la clause WHERE en fin de requête....

    Or &&PARAM1 peut prendre :
    - soit la valeur null et dans ce cas la requête doit ramener toutes les données
    - soit une valeur parmis la liste suivante de services : WEST, EST, NORD, SUD, ENT, CENT

    Du coup en l'état actuel la requête fonctionne correctement sauf pour dans deux cas de figure :
    - Lorsque &&PARAM1 = EST , la requête me raméne les données du service EST mais aussi WEST
    - Lorsque &&PARAM1 = ENT, la requête me raméne les données du service ENT mais aussi CENT...

    Alors j'essaie de trouver une parade... En testant le valeur de &&PARAM1 ... Soit avec DECODE, soit avec CASE WHEN...

    Malheureusement je n'y arrive pas...

    En esperant ne pas avoir était trop long, et bien plus clair...

    Jérémy

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    bah t'a juste à remplacer LIKE par = dans mon exemple non ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Fred_D
    bah t'a juste à remplacer LIKE par = dans mon exemple non ?
    Voilà comment j'ai fait finalement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     AND   ( 
    	 ('&&PARAM1'  IS null AND SUI.DEST LIKE '%%' ) OR (SUI.DEST = UPPER('&&PARAM1')) 
           )
    Merci beaucoup pour ton aide, même si j'ai été un peu long à la comprendre

    Jérémy

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '&&PARAM1'  IS null AND SUI.DEST LIKE '%%'
    SUI.DEST LIKE '%%' est absolument inutile

    Content d'avoir pu t'aider

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

Discussions similaires

  1. Oracle : Case dans Where qui retourne une liste
    Par stof dans le forum Oracle
    Réponses: 9
    Dernier message: 29/07/2011, 10h21
  2. Réponses: 7
    Dernier message: 24/04/2007, 17h40
  3. Réponses: 3
    Dernier message: 18/10/2005, 20h20
  4. peut-on utiliser Max dans where ?
    Par chipo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/06/2005, 14h07
  5. SUM dans where
    Par francon81 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/06/2005, 17h02

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