2009-09-09 7 views
6

J'ai une table simple, quelque chose comme: int id, date created_at, date updated_at. Je voudrais commander les lignes afin que toutes les lignes qui ont un updated_at seront triées par cela, et ceux qui ne le seront pas seront triés par le created_at. Le problème est que quelque chose comme:Commande par plusieurs champs dans SQLite

SELECT * FROM table ORDER BY updated_at, created_at 

ne fonctionne pas. J'ai regardé des clauses de commande personnalisées, quelque chose comme:

ORDER BY CASE WHERE updated_at ISNULL <do something> END, created_at 

mais ne semble pas fonctionner. Aide?

EDIT: J'ai précisé que je veux les updated_at champs pour trier avant les created_at champs. Donc, si les données ressemble à:

id created_at updated_at 
-- ---------- ---------- 
1 2009-01-08 null 
2 2009-09-08 null 
3 2009-07-02 null 
4 2009-09-05 2009-09-06 
5 2009-04-01 null 
6 2009-09-07 2009-09-08 

Je veux des résultats tels que:

id created_at updated_at 
-- ---------- ---------- 
6 2009-09-07 2009-09-08 
4 2009-09-05 2009-09-06 
2 2009-09-08 null 
3 2009-07-02 null 
5 2009-04-01 null 
1 2009-01-08 null 
+0

Mise à jour ma réponse basée sur votre mise à jour. –

Répondre

17

ressemble vous cherchez:

ORDER BY COALESCE(updated_at, created_at) 

par the docs, coalesce retours

une copie du premier n argument on-NULL. Si tous les arguments sont NULL, la valeur NULL est renvoyée. Il doit y avoir au moins 2 arguments .

Modifier: étant donné la modification de l'OP, il porterez plutôt:

ORDER BY COALESCE(updated_at, '1929-9-9') DESC, created_at DESC 

ou trucs similaires pour commander DESC; ou peut-être

ORDER BY MAX(COALESCE(updated_at, '1929-9-9'), created_at) DESC 

il est impossible de dire exactement ce que l'OP veut d'un exemple unique et très particulière, mais une variante sur certains de ces approches devrait résoudre le problème réel, quel que soit le problème peut effectivement être en particulier, détail précis et complet.

3

IFNULL, voir here

Dans ce cas, vous devriez utiliser quelque chose comme:

IFNULL (updated_at, '1-jan-2100), created_at

Toutes les colonnes sans champ updated_at recevrait l'ordre de tri par défaut et trierait par created_at. La valeur de 1-jan-2100 assure qu'ils apparaissent en dernier dans la liste. Changez cela pour être 1900 si vous les voulez d'abord.

+0

Merci, c'était super utile, mais ce n'était pas tout à fait ce que je cherchais car j'ai mal formulé ma question. Édité. –

0

Je sais que cela ne répond pas exactement à votre question, mais c'est une solution alternative.

Si vous deviez définir le champ updated_at à la même chose que created_at sur la création, vous auriez toujours une valeur pour updated_at et pourrait toujours quelque sorte par le champ updated_at.Pour une petite quantité de duplication, vous simplifiez votre code, votre vie et l'efficacité de vos requêtes SQL.

Questions connexes