Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/09/2003, 08h28   #1
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 09h04   #2
Membre habitué
 
Inscription : mai 2003
Messages : 145
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 145
Points : 146
Points : 146
essaye DESC
wello00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 09h46   #3
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à 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...
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 09h48   #4
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 09h57   #5
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
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 :
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 :
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 10h02   #6
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
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...
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 10h04   #7
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
essaye ca

Code :
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
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 12h03   #8
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
ç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
Citation:
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

Citation:
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
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 12h36   #9
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
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...
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 12h47   #10
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
a yé je pense avoir touvé un truc qui marche:
Code :
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.
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 13h35   #11
Membre du Club
 
Inscription : avril 2003
Messages : 117
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 117
Points : 62
Points : 62
impeccable ta dernière solution est la bonne

Code :
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:
Citation:
( 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.
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 13h40   #12
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
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.
@+
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h26.


 
 
 
 
Partenaires

Hébergement Web