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 :

Comment utiliser une clause IF dans une clause WHERE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Septembre 2019
    Messages : 27
    Par défaut Comment utiliser une clause IF dans une clause WHERE
    Bonjour à tous,

    Je fais appel aux bonnes âmes et les en remercie d'avance !

    Le contexte :

    J'ai encapsulé du code SQL dans un formulaire VBA (sous Excel).
    L'utilisateur du formulaire peut renseigner dans excel des variables, comme suit, avant exécution du formulaire :
    - une période (variables DD = date de début et DF = date de fin déclarées en tant que string) => ces 2 variables seront forcément renseignées
    - un n° de matricule (variable numérique déclarée en tant que Double)=> cette variable sera éventuellement renseignée.

    Mon problème :

    Je n'ai pas de résultat (sans bug) avec le code ci-dessous si la variable MATRIC n'est pas renseignée (mais OK si les 2 variables sont renseignées => données extraites pour la période et N° de matricule saisi)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (...)
     
    requete = requete & " where date(vrhoromain) between " & DD & " and " & DF & " and r1matricul = " & MATRIC & "  "
     
    (...)

    J'ai tenté un CASE dans la clause WHERE mais ne marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    (...)
     
    requete = requete & " where Case when " & MATRIC & " = 0 then date(vrhoromain) between " & DD & " and " & DF & " "
     
    requete = requete & " Else date(vrhoromain) between " & DD & " and " & DF & " and r1matricul = " & MATRIC & " end "
     
    (...)
    Si quelqu'un d'entre vous a une idée, je suis grandement preneur.
    Merci

  2. #2
    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,

    Si MATRIC n'est pas renseigné alors il faut gérer avec un COALESCE par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = requete & " where date(vrhoromain) between " & DD & " and " & DF & " and r1matricul = coalesce(" & MATRIC & ",  r1matricul) "
    En plus je pense que ce serait mieux pour ces variables dans la clause WHERE d'être des variables liées plutôt que concaténées.

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2019
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Septembre 2019
    Messages : 27
    Par défaut
    Bonjour Greg,

    Merci de ton retour.

    Je ne pense pas que le Coelesce va résoudre mon problème car cette fonction permet de retourner des valeurs numériques ou chaînes de caractères en remplacement de valeurs résultats NULL.

    Or dans mon cas, ce n'est pas la valeur retournée qui est NULL (le matricule étant un clé primaire obligatoire), mais une zone de saisie du formulaire (donnée d'entrée gérée en tant que variable) qui peut ne pas être renseignée.

    Dans ce cas, la requête me retourne aucun résultat alors qu'elle devrait me renvoyer tous les matricules concernés sur la période de temps saisie dans le formulaire.

  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,

    Oui c'est bien le but du coalesce ici. Si &MATRIC n'est pas renseigné, alors on joint la colonne avec elle-même "r1matricul = r1matricul" pour que la requête retourne tous les matricules concernés.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 600
    Billets dans le blog
    10
    Par défaut vide n'est pas "null"
    Citation Envoyé par vanagreg Voir le message
    Bonjour,
    Oui c'est bien le but du coalesce ici. Si &MATRIC n'est pas renseigné, alors on joint la colonne avec elle-même "r1matricul = r1matricul" pour que la requête retourne tous les matricules concernés.

    Attention : il ne faut pas confondre un contenu chaîne de caractères vide et une colonne ayant le marqueur "null", ce n'est pas la même chose.
    La fonction COALESCE ne traite que les colonnes marquées NULL, pas les chaînes vides !

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with tab(col1, col2) as
        (select 1, ''      union all
         select 2, null    union all
         select 3, 'ABC'   union all
         select 4, 'ZYX'   union all
         select 5, null    union all
         select 6, ''
        )
    select col1
         , col2
         , coalesce(col2, 'X')
    from tab
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col1	col2	(No column name)
    1		
    2		X
    3	ABC	ABC
    4	ZYX	ZYX
    5		X
    6

  6. #6
    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
    En effet ça doit dépendre de la base de données mais dans Oracle chaine vide = null. Il suffit dans ce cas d'utiliser un CASE WHEN &MATRIC = ''.

  7. #7
    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 escartefigue Voir le message
    Attention : il ne faut pas confondre un contenu chaîne de caractères vide et une colonne ayant le marqueur "null", ce n'est pas la même chose.
    La fonction COALESCE ne traite que les colonnes marquées NULL, pas les chaînes vides !
    C'est vrai pour la grande majorité des SGBD à l'exception d'Oracle qui mélange allègrement chaîne vide et NULL
    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.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/02/2019, 13h16
  2. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  3. [Langage]Comment utiliser une dll .NET dans VB6?
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/04/2006, 14h20
  4. Réponses: 4
    Dernier message: 16/02/2006, 16h28

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