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 :

Oracle : Tri de date incorrect


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut Oracle : Tri de date incorrect


    J'ai un petit souci de trie de date :
    J'ai un table où il y'a un champ de type Date qui est alimenter a fur et à mesure des modifications dans l'application, ce champ peut contenir des fois des valeur NULL.

    lorsque je demande un trie décroissant, il m'affiche d'abord les valeurs NULL puis les champs date trier, or moi je cherche d'abord à afficher les valeurs date au début puis ceux qui ont la valeur NULL à la fin de la liste,

    Est ce que vous pouvez m'aider concernant ce point ?

    Pour le trie, j'utilise la clause ORDER BY simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY DATE_MODIF DESC;
    Merci infiniment pour vos réponse

  2. #2
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Ce genre de requete peut vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select * 
        from Matable 
        order by 
              case ladate when null then 0 else 1 end desc , ladate desc
    A tester et adapter

    Bon courage

  3. #3
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Merci pour votre réponse,

    Le souci est toujours détécté, j'ai fait exactement ce que vous m'avez suggerer, mais en vain...

    Est ce que à votre avis le souci peut venir de mon SGBDR ? j'utiliser Oracle 9i

  4. #4
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    En recherche sur internet concernant la clause order by et les nulls, j'ai trouver qu'on pourra ajouter une autre clause nulls last afin d'obtenir le résultat que je cherche.

    Je pense que par défaut il est a nulls first

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY DATE_MODIF DESC NULLS LAST
    Je vais opter pour cette solution vu que je suis un peu présse, mais je voudrais bien conprendre le bout de code que vous m'avez donner, juste a titre d'information.

    Merci à vous...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Le NULLS LAST semble être une bonne solution.

    J'ai testé sous Oracle 10g celle proposée par Yanika_bzh, le tri n'est pas vraiment celui attendu

    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
    SQL> select *
      2  from 
      3  (
      4  select 1 as champs1 from dual
      5  union all
      6  select 4 from dual
      7  union all
      8  select 12 from dual
      9  union all
     10  select 2 from dual
     11  union all
     12  select null from dual
     13  union all
     14  select 123 from dual
     15  union all
     16  select 99 from dual
     17  union all
     18  select null from dual
     19  )
     20  order by case champs1 when null then 0 else 1 end desc;
     
       CHAMPS1
    ----------
             1
             4
            12
     
     
           123
            99
             2
     
    8 ligne(s) sélectionnée(s).

  6. #6
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Le NULLS LAST semble être une bonne solution.

    J'ai testé sous Oracle 10g celle proposée par Yanika_bzh, le tri n'est pas vraiment celui attendu

    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
    SQL> select *
      2  from 
      3  (
      4  select 1 as champs1 from dual
      5  union all
      6  select 4 from dual
      7  union all
      8  select 12 from dual
      9  union all
     10  select 2 from dual
     11  union all
     12  select null from dual
     13  union all
     14  select 123 from dual
     15  union all
     16  select 99 from dual
     17  union all
     18  select null from dual
     19  )
     20  order by case champs1 when null then 0 else 1 end desc;
     
       CHAMPS1
    ----------
             1
             4
            12
     
     
           123
            99
             2
     
    8 ligne(s) sélectionnée(s).
    Votre test n'a rien a voir avec mon exemple...
    le premier case est celui qui va permettre de gerer le NULL dans la colonne, le deuxieme tri est celui qui va vous permettre de realiser l'order attendu

    exemple :

    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
     
    create table #T1 (ladate datetime null, id int)
    insert into #T1 values ('20090101',1)
    insert into #T1 values ('20090111',2)
    insert into #T1 values ('20090221',3)
    insert into #T1 values ('20090317',4)
    insert into #T1 values ('20090104',5)
    insert into #T1 values (null,6)
    insert into #T1 values (null,7)
    insert into #T1 values (null,8)
     
    select * from #T1 order by /* Gestion du null */ case ladate when null then "0" else "1" end desc , /* tri normal */ ladate desc
     
    Resultat :
    ladate                          id
    Mar 17 2009 12:00AM	          4
    Feb 21 2009 12:00AM	          3
    Jan 11 2009 12:00AM	          2
    Jan  4 2009 12:00AM	          5
    Jan  1 2009 12:00AM	          1
    	                          6
    	                          7
    	                          8
    Si null, alors on simule une colonne dont l'ordre de tri (0) sera toujours inférieure a la colonne si non null (1)

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Je mets la requête avec le deuxième tri :
    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
    SQL> select *
      2  from 
      3  (
      4  select 1 as champs1 from dual
      5  union all
      6  select 4 from dual
      7  union all
      8  select 12 from dual
      9  union all
     10  select 2 from dual
     11  union all
     12  select null from dual
     13  union all
     14  select 123 from dual
     15  union all
     16  select 99 from dual
     17  union all
     18  select null from dual
     19  )
     20  order by case champs1 when null then 0 else 1 end desc, champs1 desc;
     
       CHAMPS1
    ----------
     
     
           123
            99
            12
             4
             2
             1
     
    8 ligne(s) sélectionnée(s).
    Les NULL apparaissent bien en tête de liste. J'ai donc enlevé la seconde colonne de tri pour voir, et le résultat est dans mon précédent post.
    Je veux bien croire que quelque chose m'échappe, mais pas que ça n'a "rien à voir" avec votre exemple.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    J'ajoute que là où je voulais en venir en précisant que je test sous Oracle 10g, c'est que cette solution ne fonctionne manifestement pas directement sous Oracle, ce qui ne veut pas dire qu'elle est mauvaise. Ca ne fonctionne pas non plus pour aelmalki qui est sous Oracle 9i.

    Oracle n'interprete pas pareil le 'CASE WHEN NULL'. J'ai remplacé ce test par 'case when champs1 is null', et ça fonctionne :
    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
    SQL> select *
      2  from 
      3  (
      4  select 1 as champs1 from dual
      5  union all
      6  select 4 from dual
      7  union all
      8  select 12 from dual
      9  union all
     10  select 2 from dual
     11  union all
     12  select null from dual
     13  union all
     14  select 123 from dual
     15  union all
     16  select 99 from dual
     17  union all
     18  select null from dual
     19  )
     20  order by CASE WHEN champs1 is null then 0 else 1 end desc, champs1 desc;
     
       CHAMPS1
    ----------
           123
            99
            12
             4
             2
             1
     
     
     
    8 ligne(s) sélectionnée(s).
    Et pour cause, le cas WHEN NULL n'est manifestement jamais vérifié pour Oracle :
    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
    SQL> SELECT CASE champs1 WHEN NULL THEN 0 ELSE 1 END AS test
      2  FROM 
      3  (
      4  select 1 as champs1 from dual
      5  union all
      6  select 4 from dual
      7  union all
      8  select 12 from dual
      9  union all
     10  select 2 from dual
     11  union all
     12  select null from dual
     13  union all
     14  select 123 from dual
     15  union all
     16  select 99 from dual
     17  union all
     18  select null from dual
     19  );
     
          TEST
    ----------
             1
             1
             1
             1
             1
             1
             1
             1
     
    8 ligne(s) sélectionnée(s).

  9. #9
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    D'ou le "A tester et Adapter" ...

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    D'où le fait que je test, et que j'adapte.

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Oracle n'interprete pas pareil le 'CASE WHEN NULL'. J'ai remplacé ce test par 'case when champs1 is null', et ça fonctionne
    En effet, la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE <expression> WHEN <valeur> THEN <retour_vrai> ELSE <retour_faux> END
    est interprétée comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN <expression> = <valeur> THEN <retour_vrai> ELSE <retour_faux> END
    Si <valeur> est NULL, alors <expression> = NULL n'est jamais vérifié et l'expression CASE... retourne toujours <retour_faux>.
    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.

  12. #12
    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
    Il existe aussi nvl2 - sur Oracle uniquement - qui effectue ce même test, mais personnellement je ne me souviens jamais dans quel ordre le test est fait : d'ailleurs je me suis trompé en l'écrivant de mémoire, raison pour laquelle je préfère le case nettement plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
        champs1,
        nvl2(champs1, 1, 0) AS nvl2,
        CASE WHEN champs1 IS NULL then 0 else 1 end AS case_ok,
        CASE champs1 WHEN NULL then 0 else 1 end AS case_ko
    FROM
    (SELECT 99 as champs1 FROM dual
    union ALL SELECT NULL FROM dual)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHAMPS1	NVL2	CASE_OK	CASE_KO
    99	1	1	1
    null	0	0	1

  13. #13
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il existe aussi nvl2 qui effectue ce même test, mais personnellement je ne me souviens jamais dans quel ordre le test est fait : d'ailleurs je me suis trompé en l'écrivant de mémoire, raison pour laquelle je préfère le case nettement plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
        champs1,
        nvl2(champs1, 1, 0) AS nvl2,
        CASE WHEN champs1 IS NULL then 0 else 1 end AS case_ok,
        CASE champs1 WHEN NULL then 0 else 1 end AS case_ko
    FROM
    (SELECT 99 as champs1 FROM dual
    union ALL SELECT NULL FROM dual)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHAMPS1	NVL2	CASE_OK	CASE_KO
    99	1	1	1
    null	0	0	1
    Nettement plus lisible et surtout nettement plus portable

  14. #14
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    VOUS ÊTES NETTEMENT PLUS EXPLICATIF

    Merci beaucoup pour vos explications !

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

Discussions similaires

  1. Tri de dates incorrectes
    Par Jah73 dans le forum Développement
    Réponses: 5
    Dernier message: 03/06/2013, 10h15
  2. Equivalent à TRUNC ou ROUND d'Oracle sur les Dates ?
    Par swirtel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/05/2005, 09h45
  3. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19
  4. Tri et Dates
    Par romainw dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2004, 11h30
  5. Filtre, Tri, Index, Date
    Par gibet_b dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/07/2004, 16h30

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