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

PL/SQL Oracle Discussion :

Clause conditionnable dans une requête statique


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut Clause conditionnable dans une requête statique
    Il me semble qu'un sujet traitait de cela mais je n'ai pas réussi à le retrouver

    Est-il possible (proprement) de conditionner une clause WHERE dans une requête sans passer par du SQL dynamique

    Par exemple j'aimerais pouvoir préciser un Groupe dans la requête seulement si pe_groupe est renseigné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Groupe, Code
    FROM    Table_codes
    WHERE Groupe = pe_groupe
    Il y a bien la solution du DECODE mais ce n'est pas d'une propreté exemplaire même si ça marche.

    PS : L'exemple cité est simpliste et je voudrais l'appliquer à des requêtes bien plus volumineuses et par conséquent la solution d'avoir deux requêtes ne convient pas

    Merci

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Je ne sais pas si c'est la même que ta solution décode, mais tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Groupe, Code
    FROM    Table_codes
    WHERE (pe_groupe is null or Groupe = pe_groupe)

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    C'est la même chose dans le sens qu'elle va faire un full scan.

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Oui ça revient au même en peut-être un peu plus propre

    La solution que j'avais jusque là était
    WHERE Groupe=DECODE(pe_groupe,NULL,groupe,pe_groupe)

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est la même chose dans le sens qu'elle va faire un full scan.
    Même quand le critère est non null ?

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    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
     
    SQL> var a number
    SQL> exec :a := 10
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> set autotrace on
     
    SQL> r
      1  Select d.department_name
      2    From hr.departments d
      3*  Where (:a is null or d.department_id = :a)
     
    DEPARTMENT_NAME
    ------------------------------
    Administration
     
     
    Plan d'exécution
    ----------------------------------------------------------
    Plan hash value: 2594557485
     
    ---------------------------------------------------------------------------------
    | Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |             |     2 |    32 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| DEPARTMENTS |     2 |    32 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(:A IS NULL OR "D"."DEPARTMENT_ID"=TO_NUMBER(:A))
     
     
    Statistiques
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              8  consistent gets
              0  physical reads
              0  redo size
            542  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Pfff ouais, c'est triste...

    J'ai essayé des variantes, et j'ai pas eu la même chose entre COALESCE et NVL
    (C'est bien sensé faire la même chose, non ?)

    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
     
    SQL> create table testeuh(l primary key) as select level l from dual connect by level <= 100000;
     
    SQL> VARIABLE i NUMBER;
    SQL> exec :i:=1
    SQL> set autot on explain
     
    SQL> select * from testeuh where l = nvl(:i, l);
     
             L
    ----------
             1
     
    EcoulÚ : 00 :00 :00.00
     
    Plan d exÚcution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=39 Card=675 Bytes=
              8775)
     
       1    0   CONCATENATION
       2    1     FILTER
       3    2       TABLE ACCESS (FULL) OF 'TESTEUH' (TABLE) (Cost=38 Card
              =674 Bytes=8762)
     
       4    1     FILTER
       5    4       INDEX (UNIQUE SCAN) OF 'SYS_C00404681' (INDEX (UNIQUE)
              ) (Cost=1 Card=1 Bytes=13)
     
    SQL> SELECT * FROM testeuh WHERE l = COALESCE(:i, l);
     
             L
    ----------
             1
     
    EcoulÚ : 00 :00 :00.00
     
    Plan d exÚcution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=42 Card=1136 Bytes
              =14768)
     
       1    0   TABLE ACCESS (FULL) OF 'TESTEUH' (TABLE) (Cost=42 Card=113
              6 Bytes=14768)

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

Discussions similaires

  1. [AC-2010] Clause WHERE dans une requète
    Par Brëzz dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 12/04/2013, 15h38
  2. clause LIMIT dans une requête UPDATE
    Par Dominique49 dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/12/2011, 11h06
  3. Problème clause "like" dans une requête
    Par the-player777 dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 16/01/2008, 16h58
  4. Clause IF dans une requête
    Par Asdorve dans le forum Langage SQL
    Réponses: 7
    Dernier message: 31/08/2007, 15h43
  5. requete conditionnée dans une requête
    Par lodan dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2007, 11h31

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