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 :

Requête avec des NULL dans des dates [18c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut Requête avec des NULL dans des dates
    Bonjour,

    J'ai un petit problème de requête. J'ai un bloc PL/SQL qui a deux paramètres en entrée qui sont date_deb et date_fin. ce script sql est lancé par un shell linux.

    Et je vais simplifier la requête c'est quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ma_table
    WHERE date BETWEEN date_deb AND date_fin;
    Sauf que, et c'est là que ça pose problème. Selon ce que lui envoie le shell, les paramètres peuvent soit avoir une valeur (DD/MM/YYYY) soit avoir la valeur 'NULL'
    Les paramètres sont évidemment des chaînes de caractères mais j'arrive à les transformer en format DATE et leur donner soit la date, soit la valeur null.

    Par contre, c'est dans la requête que ça merde.
    Si les deux paramètres sont égaux à NULL, la requête deviendrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table;
    Si date_deb est renseignée et date_fin est à NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ma_table
    WHERE date >= date_deb;
    Si date_deb est à NULL et date_fin est renseignée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ma_table
    WHERE date <= date_fin;
    et si les deux dates sont renseignées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ma_table
    WHERE date BETWEEN date_deb AND date_fin;

    Y-a-t 'il une façon de gérer tout ça dans une seule requête ?

    Merci pour votre aide.

    Michel

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
      from MaTable
     where MaDate >= coalesce(date_deb, MaDate)
       and MaDate <= coalesce(date_fin, MaDate);

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    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 132
    Par défaut
    Une solution parmi d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  *
    FROM    ma_table
    WHERE   ma_date BETWEEN COALESCE(date_deb, ma_date) AND COALESCE(date_fin, ma_date)
    ;
    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.

  4. #4
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Merci à tous les deux.

    Par contre, j'aime bien comprendre, et là même en regardant la doc de COALESCE, je ne comprends vos versions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  *
    FROM    ma_table
    WHERE   ma_date BETWEEN COALESCE(date_deb, ma_date) AND COALESCE(date_fin, ma_date)
    ;
    Ca veut dire que si date_deb et date_fin sont à null, le select se fera entre ma_date et ma_date ?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    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 132
    Par défaut
    ma_date BETWEEN ma_date AND ma_date est toujours vrai
    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.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    On vous a proposé la même solution, between n'étant qu'un raccourci syntaxique vers >= and <=.

    Si vos deux date_deb et date_fin sont nulles, votre requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
      from MaTable
     where MaDate >= MaDate
       and MaDate <= MaDate;
    Ces deux expressions étant vraies, ça revient à select * from MaTable.

  7. #7
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    C'est vraiment impressionnant...
    Je suis scié... parce que forcément j'ai testé plusieurs configurations.. C'est vraiment trop fort.
    Un grand merci à vous.

    Michel

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

Discussions similaires

  1. Requête avec des dates
    Par Daviloppeur dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/05/2010, 12h28
  2. VB + Excel + SQL + Soucis requête avec des dates
    Par Invité dans le forum Excel
    Réponses: 2
    Dernier message: 12/03/2009, 08h15
  3. Requête avec des dates
    Par Danielle80 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/11/2007, 12h57
  4. requête avec des dates
    Par brigdid dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/06/2007, 09h22
  5. SQL Requête avec des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/03/2006, 18h20

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