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 :

[SQL] Optimiser un WHERE Conditionnel : supprimer un LIKE '%'


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Par défaut [SQL] Optimiser un WHERE Conditionnel : supprimer un LIKE '%'
    Bonjour à tous,

    Je cherche à optimiser un WHERE conditionnel en SQL Oracle (pas de PL/SQL).

    Dans un premier écran de filtrage, l'utilisateur peut saisir ou non un numéro de département dans le champ :C3_DEP.
    Je voudrais pouvoir utiliser ou non ce paramètre dans le WHERE d'une requête.

    Actuellement, j'en suis à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ADR_RUE, ADR_CP, ADR_VILLE, ADR_DEP
    FROM T_ADRESSE
    WHERE (ADR_DEP LIKE (
          CASE 
            WHEN :C3_DEP IS NULL then
              '%'
            ELSE
              :C3_DEP
            end)
        )
    Cela fonctionne correctement, mais le code est très lent, surtout quand il n'y a aucun filtrage (le LIKE '%' qui en résulte est à la fois inutile et gourmand)

    Précisions :
    - Je ne peux pas construire la requête puis faire un EXECUTE IMMEDIATE car le contexte (htmldb 2.0) ne le permet pas. Ce doit donc être un SELECT "pur"
    - je suis sous Oracle 10.2
    - il y 6 autres critères similaires (cad avec la possibilité d'avoir un LIKE '%')

    En vous remerciant par avance,

    Yvan

  2. #2
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Est-ce que cela peut t'aider ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ADR_RUE, ADR_CP, ADR_VILLE, ADR_DEP 
    FROM T_ADRESSE 
    WHERE ADR_DEP = nvl(:C3_DEP, ADR_DEP)
    Nicolas.

  3. #3
    Membre chevronné Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Par défaut
    Merci beaucoup Nicolas !
    Et merci pour ta réponse rapide.

    La ligne que tu proposes accélère considérablement le travail de 5 des 7 critères ! Simple et terriblement efficace.

    Je vais regarder comment appliquer cette idée aux deux autres critères.

    Yvan

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Pense que plutôt de gérer des case when, tu peux également faire des or :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from maTable
    where ((:param1 = 1 and maCol1 = 'A')
               or (:param1 = 2 and maCol2 = 'A')
               or :param1 is null=);

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par NGasparotto
    Est-ce que cela peut t'aider ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ADR_RUE, ADR_CP, ADR_VILLE, ADR_DEP 
    FROM T_ADRESSE 
    WHERE ADR_DEP = nvl(:C3_DEP, ADR_DEP)
    Nicolas.
    Attention si :C3_DEP n'est pas renseigné, la requete ne ramenera jamais les lignes pour lesquelles adr_rep est NULL (s'il peut être NULL)

    Si ce cas peut se présenter faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NVL(ADR_DEP, '-1') = nvl(:C3_DEP, NVL(ADR_DEP,'-1'))
    avec '-1' une chaine qui n'existe pas dans adr_dep.. Facile dans le cas de numbers > 0, plus dur pour les chaines.
    Le mieux dans ce cas, c'est encore le OR IS NULL

  6. #6
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par McM
    Attention si :C3_DEP n'est pas renseigné, la requete ne ramenera jamais les lignes pour lesquelles adr_rep est NULL (s'il peut être NULL)
    Biensur, mais j'ai donné une requête équivalente à la requête initialement donné, pour laquelle rien n'est ramené dans le cas d'une valeur null.

    Ou bien je me trompe ?

    Nicolas.

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Je tenais juste à préciser. Si Ypicot ne connais pas le NVL, ça peut lui éviter des mauvaises surprises.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Histoire de faciliter la compréhension s'il en était encore besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ADR_RUE, ADR_CP, ADR_VILLE, ADR_DEP
    FROM T_ADRESSE
    WHERE (ADR_DEP LIKE (
          CASE 
            WHEN :C3_DEP IS NULL then
              ADR_DEP
            ELSE
              :C3_DEP
            end)
        )
    Et LIKE = si possible

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

Discussions similaires

  1. [PL/SQL] Optimisation d'une requête (like?)
    Par elyo66 dans le forum SQL
    Réponses: 15
    Dernier message: 01/06/2007, 19h44
  2. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 16h01
  3. [SQL Server 2000] configurer ou supprimer une connexion
    Par drinkmilk dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/08/2005, 21h48
  4. [SQL] optimisation
    Par s.grenet dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/05/2005, 11h57
  5. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52

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