2009-09-09 7 views
6

Ich habe eine einfache Tabelle, etwas wie: int id, date created_at, date updated_at. Ich möchte die Zeilen so ordnen, dass alle Zeilen, die eine updated_at haben, damit sortiert werden, und alle, die nicht nach created_at sortiert werden. Das Problem ist, dass etwas wie:Sortierung nach mehreren Feldern in SQLite

SELECT * FROM table ORDER BY updated_at, created_at 

nicht funktioniert. Ich habe auf benutzerdefinierte Auftragsklauseln, etwa wie folgt:

aber kann nicht scheinen, etwas zur Arbeit zu bekommen. Hilfe?

EDIT: ich angegeben haben sollte, dass ich die updated_at Felder vor den created_at Feldern sortieren möchten. Also, wenn die Daten wie folgt aussieht:

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 

Ich würde wollen Ergebnisse wie:

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

Aktualisiert meine Antwort basierend auf Ihrem Update. –

Antwort

17

sieht aus wie Sie suchen:

ORDER BY COALESCE(updated_at, created_at) 

pro the docs, coalesce kehrt

eine Kopie der ersten n Ein-NULL-Argument. Wenn alle Argumente NULL sind, wird NULL zurückgegeben. Es muss mindestens 2 Argumente geben.

bearbeiten: das Bearbeiten des OP gegeben, so kann er stattdessen wollen:

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

oder ähnliche Tricks für DESC Ordnung; oder vielleicht

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

ist es unmöglich, genau zu sagen, was der OP will von einem einzigen und sehr eigenartigen Beispiel, aber eine Variante auf einig einem diesen Ansätze sollte sein eigentliches Problem lösen, was auch immer das Problem tatsächlich in spezifisch sein kann, präzise und vollständige Details.

3

IFNULL finden here

In diesem Fall Sie so etwas wie verwenden würde:

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

Alle Spalten ohne updated_at Feld würde die standardmäßige Sortierreihenfolge erhalten und würde dann nach created_at sortieren. Der Wert von 1-jan-2100 stellt sicher, dass sie als letzte in der Liste erscheinen. Ändern Sie dies zu 1900, wenn Sie sie zuerst möchten.

+0

Danke, das war super hilfreich, aber es war nicht ganz das, wonach ich suchte, weil ich meine Frage schlecht formuliert hatte. Bearbeitet. –

0

Ich weiß, dass dies Ihre Frage nicht genau beantwortet, aber es ist eine alternative Lösung.

Wenn Sie das updated_at Feld auf die gleiche wie created_at auf Schöpfung setzen, würden Sie immer einen Wert für updated_at haben und konnte immer nur irgendwie durch die updated_at Feld.Für eine kleine Menge an Duplizierung vereinfachen Sie Ihren Code, Ihr Leben und die Effizienz Ihrer SQL-Abfragen.

Verwandte Themen