2008-09-29 10 views
48

J'ai un tas de tâches dans une base de données MySQL, et l'un des champs est "date limite". Pas chaque tâche doit avoir à une date limite. Je voudrais utiliser SQL pour trier les tâches par date limite, mais mettre celles sans date limite à l'arrière du jeu de résultats. Comme c'est le cas maintenant, les dates nulles apparaissent en premier, puis les autres sont triées par date limite au plus tard.Possibilité d'utiliser SQL pour trier par date mais mettre des dates nulles à la fin du jeu de résultats?

Des idées sur la façon de faire cela avec SQL seul? (Je peux le faire avec PHP si nécessaire, mais une solution SQL seule serait géniale.)

Merci!

Répondre

62

est ici une solution en utilisant uniquement SQL standard, pas isNull(). Cette fonction n'est pas standard SQL et peut ne pas fonctionner sur d'autres marques de SGBDR.

SELECT * FROM myTable 
WHERE ... 
ORDER BY CASE WHEN myDate IS NULL THEN 1 ELSE 0 END, myDate; 
+0

+1. Voici une autre solution standard élégante et compacte (disponible depuis [SQL: 2003 extension T611] (http://en.wikipedia.org/wiki/Order_by), bien que tous les fournisseurs n'implémentent pas cette fonctionnalité): http://stackoverflow.com/ a/12767777/814702. – informatik01

+1

@ informatik01, bonne astuce, mais cette question est étiquetée 'mysql' et MySQL ne supporte pas cette syntaxe. –

+0

@BillKarwin Oui, triste. Seulement vérifié ceci sur PostgreSQL 9.1, où cela fonctionne très bien. Quoi qu'il en soit, laissez cette information être ici juste pour l'exhaustivité. P.S. Juste remarqué que lorsque vous utilisez 'ORDER BY' MySQL et PostgreSQL se comportent différemment: lors de la commande * ascendant * MySQL met les valeurs NULL ** en premier **, alors que PostgreSQL met les valeurs NULL ** en dernier **. Eh bien, des trucs spécifiques au vendeur ... – informatik01

4
SELECT foo, bar, due_date FROM tablename 
ORDER BY CASE ISNULL(due_date, 0) 
WHEN 0 THEN 1 ELSE 0 END, due_date 

Vous avez donc 2 clauses à trier par. La première met tous les non-valeurs NULL devant, trie par date d'échéance après

+0

"case isnull (due_date, 0) quand 0 puis 1 sinon 0" - pourquoi s'embêter à faire tout ça? isnull renvoie 1 ou 0 de toute façon. – nickf

+0

Dans MSSQL, ISNULL renvoie son premier argument, ou son deuxième argument si son premier argument est null. Il y a une fonction SQL standard COALESCE qui fait la même chose et accepte aussi plus de deux arguments. Mais c'est un peu hors-sujet puisque l'affiche pose des questions sur MySQL .... – Stewart

28
SELECT * FROM myTable 
WHERE ... 
ORDER BY ISNULL(myDate), myDate 
+0

ISNULL nécessite 2 arguments sur SQL Server. Est-ce que MySQL n'en nécessite qu'un? – Codewerks

+3

yep - un seul. http://dev.mysql.com/doc/refman/5.0/fr/comparison-operators.html#function_isnull – nickf

+0

Notez que, dans le cas d'Access/VBA, 'True

Questions connexes