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

Requêtes PostgreSQL Discussion :

tri avec les champs vides en dernier


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut tri avec les champs vides en dernier
    bonjour,

    dans une de mes requête, je fais un 'order by' des plus classiques sur une de mes colonnes et il m'affiche les champs nuls en premiers; je voudrais que l'inverse se produise: les champs avec des valeurs en premier (et trié de manière croissante) et ensuite les champs vides et nuls.

    j'ai vu une question oracle avec la question inverse avec une fonction NVL apparemment mais cette fonction n'a pas l'air de fonctionner sous PG

    merci d'avance pour vos réponses

  2. #2
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Points : 172
    Points
    172
    Par défaut
    essaye DESC

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    utilise cette fonction postgresql:
    COALESCE(ton_champ,'0')
    cette fonction remplace ton_champ par 0 quand il est NULL, ce qui permet de solutionner ton problème d'ORDER BY...j'ai eu le problème la semaine dernière alors apres une semaine de test, ca roule...

  4. #4
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    ben DESC va me les classer par ordre décroissant, moi je veux envoyer les résultats avec mon champ qui est NULL à la fin avec mes résultats avec des valeurs non nulles classés par ordre croissant

  5. #5
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par doohan
    utilise cette fonction postgresql:
    COALESCE(ton_champ,'0')
    cette fonction remplace ton_champ par 0 quand il est NULL, ce qui permet de solutionner ton problème d'ORDER BY...j'ai eu le problème la semaine dernière alors apres une semaine de test, ca roule...
    j'ai essayé avec deux synthaxe différentes mais ça ne marche pas (je conçois que ça doit surement venir de moi )

    voila ce que j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * ,COALESCE(mat_champ1,'0')
    from materiel,type_materiel 
    where mat_typ_num=15 
    and mat_typ_num=typ_num and 
    mat_inv_num LIKE 'INF%' 
    order by  mat_champ1
    et ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from materiel,type_materiel 
    where mat_typ_num=15 
    and mat_typ_num=typ_num and 
    mat_inv_num LIKE 'INF%' 
    order by COALESCE(mat_champ1,'0')
    dans les deux cas, j'ai pas d'erreur affiché mais ça ne marche pas.
    les résultats mettent les champs à 0 en premier et après c classé de manière croissante

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    La seul solution que j'ai trouvé était la fonction que je t'ai donnée et elle fonctionne trés bien. Si tu veux absolument récupérer ton champ null au final, tu as deux possibilité, la première (et celle que me semble le mieux) est que tu fait dans ta requete deux selection sur le champs a probleme, tu fait l'order by sur le champ avec le COALESCE et tu aura en face de cette colonne ton autre colonne avec tes valeurs NULL...(j'espère que ca correspond bien a ton problème).
    Si le problème ne concerne que l'affichage, tu peu faire le COALESCE et tu fais seulement un retraitement avec PHP ou ASP ou autre ou tu remplace 0 par NULL...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    essaye ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select  * ,COALESCE(mat_champ1,'0') as mon_champ
    from materiel,type_materiel 
    where mat_typ_num=15 
    and mat_typ_num=typ_num and 
    mat_inv_num LIKE 'INF%' 
    order by  mon_champ DESC

  8. #8
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    ça ne fonctionne pas...
    je me rends compte que tu cherches des solutions mais que ça convient pas, je dois mettre mal exprimé c sûr!!

    j'ai une table avec (entre autres) mat_champ1 de type integer.
    quand je fais des enregsitrements dans la table, si mat_champ1 n'est pas renseigné, Postgres le met à 0. Perso dans mon script je fais un insert avec mat_champ1=NULL

    donc dans tous mes enregsitrements (une cenatine quand même ), des fois, matchamp1 est à 0 (pas de valeur) ou une valeur entière.

    lors de l'affichage de la table en utilisant un order by normal j'ai ceci
    matchamp1
    -------------
    0
    0
    0
    0
    0
    40
    40
    45
    90
    90
    et moi je voudrais que si le champ est NULL, ces enregistrements soient en fin comme ceci

    40
    40
    45
    90
    90
    0
    0
    0
    0
    0
    voila j'espère que là, je me suis exprimé pour être compris

    si la solution marche aussi pour des champs avec des chaines (dans ce cas, mes champs sont vides quansd il y a rien dedans), ça serait un plus non négligeable

    encore merci

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    oui en effet j'etais un peu a coté de la plaque... ( NULL != 0)

    Bon maintenant qu'o se comprend j'ai quelques question supplémentaire parceque là franchement je vois pas de solution simple et propre a ton problème.

    Est-ce que ton champs a une valeur Maximale ?
    (si oui on pourrai faire une selection sur la colonne en remplacant les 0 par une valeur qui sera de toute facon la plus grande, puis trier sur cette colonne, les vrai valeur se trouvant dans une colonne non-modifié.
    Mais bon c'est un peu sale comme methode)
    Est-ce que tu veux absolument faire ton trie dans la requete ou tu peux le faire ensuite du style en PHP, ASP ou autre ?

    Voilou...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    a yé je pense avoir touvé un truc qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select  mon_champ 
    from matable 
    order by  mon_champ>0 DESC
    j'ai essayé et ca a l'air de fonctionner bien.
    Tiens moi au courant.

  11. #11
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    impeccable ta dernière solution est la bonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * 
    from materiel,type_materiel 
    where mat_typ_num=15 
    and mat_typ_num=typ_num 
    and mat_inv_num LIKE 'INF%' 
    order by mat_champ1 >0 DESC
    merci beacoup c exactement c qu'il me fallait (on a quand même fini par se comprendre )

    PS: c quand même une synthaxe bizaroide!! parce qu'avec DESC, j'aurais du les avoir décroissant et le ' > 0' n'aurait pas dû me donner les valeurs à 0

    enfin bon ça marche et c le principal, encore merci


    PS2:
    ( NULL != 0)
    je sais mais comme quand je faisais un insert je mettais a NULL le champ s'il n'y avait rien, je pensais que le champ était vide dans la base.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    pour la syntaxe, le >0 signifie que pour tout ce qui est superieur a 0 dans ce champ, le trie qui s'applique est le DESC.
    Forcément, les autres champs (égale a zéro) sont rajoutés à la fin du résultat et non pas supprimé (le order by ne fonctionne pas comme un Where).

    Bon voilà pour la ptite explication.
    @+

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/11/2014, 07h51
  2. problème de sélection avec les champs vides
    Par danathane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 16h45
  3. LIKE et les champs vide
    Par XioN dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/08/2004, 16h24
  4. tri avec les champs vides en dernier
    Par r-zo dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 03/09/2003, 13h40
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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