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

Langage SQL Discussion :

tout retourner avec la fonction NVL


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut tout retourner avec la fonction NVL
    Bonjour,

    Voila j'ai une requête qui, pour effectuer un filtrage, effectue une sous requête dans la clause WHERE.

    Cette sous-requête est construite comme ceci pour l'instant (mais qui ne fait pas encore ce que je souhaite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id
    FROM ma_table
    WHERE champ_1 LIKE NVL(CONCAT(CONCAT('var1', '/'), 'var2'), 'tout')
    AND champ_2 = NVL('var3', 'tout');
    Explication :
    le champ_1 est en fait une concaténation de deux valeurs, d'ou la première condition.
    var1 var2 et var3 sont des valeurs récupérées de php
    tout est ce que je voudrais récupérer.

    En gros, je voudrais que si les concat de la première condition ne vaut rien, le NVL me retourne toutes les valeurs que le champ contient (idem pour le champ_2)

    J'ai déjà essayé de remplacer le 'tout' par % (on m'avait dit que ça pourrait être ça) et par * mais aucun des deux ne marche.

    Peut-être que ce n'est pas la fonction qu'il me faut je ne sais pas.
    J'avais également pensé ) faire une sous requête qui renverrait tous les résultats à la place du 'tout' mais si je pouvais éviter (si il n'y a que cette solution la ce n'est pas grave)

    Merci d'avance pour votre aide !

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Salut,

    Déjà ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONCAT(CONCAT('var1', '/'), 'var2')
    ne vaudra jamais null, mais ça vaudra toujours

    au pire si tu enleves les quotes, ça vaudra simplement '/'.

    Peut être comme ça, ça marchera mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id
    FROM ma_table
    WHERE 
        ((champ_1 LIKE CONCAT(CONCAT(var1, '/'), var2) or (var1 is null and var2 is null))
    AND (champ_2 = var3 or var3 is null)

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    En effet je n'avais pas pensé au /

    J'ai essayé si j'ai seulement var1 de renseigné il ne me retourne rien (par contre il retourne bien tout si j'ai rien, et seulement ce que je veux si j'ai var1 et var2 de renseigné et var1, var2 et var3 de renseigné)

  4. #4
    Scorpi0
    Invité(e)
    Par défaut
    Et donc c'est bon?

    Si tu veux que ça retourne tout si seulement l'un des deux premiers var est null, alors tu as toutes les billes en main pour travailler la requête toi même

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Ben ouai mais il y a justement le cas qui ne fonctionne pas que je ne comprends pas.

    imaginons que j'ai des entrées ayant comme valeur pour champ_1 'bla/bla' et 'bli/blo'

    si je ne renseignait que var1 avec bla par exemple, le where donnerait donc champ_1 like 'bla/' et me renverrait donc la première valeur, or la il ne me renvoie rien à chaque fois si seulement var1 est renseigné et je ne vois pas pourquoi ...

  6. #6
    Scorpi0
    Invité(e)
    Par défaut
    Ah oui c'est un peu de ma faute, le LIKE ne sert à rien si il n'y a pas un '%' quelque part, sinon autant mettre un '='.

    Il y a peut être plus simple, mais cela résoudra le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id
    FROM ma_table
    WHERE 
        (
             (champ_1 = CONCAT(CONCAT(var1, '/'), var2))
          OR (var1 IS NULL AND var2 IS NULL) 
          OR (var2 is null and champ_1 like CONCAT(var1, '/%')) 
        )
    AND (champ_2 = var3 OR var3 IS NULL)

  7. #7
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    C'est bon ça me renvoie bien comme il faut merci

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/12/2007, 18h49
  2. Retourner un tableau d'entier avec une fonction ?
    Par Seb33300 dans le forum C++
    Réponses: 10
    Dernier message: 05/04/2007, 16h25
  3. voir tout les appels de fonction avec le debugger?
    Par decksroy dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 03/10/2006, 11h33
  4. probleme avec une fonction enable() toute simple !!
    Par K_!!! dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/05/2006, 15h10
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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