2012-06-12 9 views
7

C'è un modo per combinare ORDER BY e IS NULL in sql in modo che possa ordinare per una colonna se la colonna non è nulla, ma se è nullo, ordine da un'altra colonna?Ordina per Colonna1 se Colonna1 non è nullo, altrimenti ordina per Colonna2

Grazie!

+1

[http://stackoverflow.com/questions/5055540/order-by-countcolumns-not-null][1] - qui è la risposta alla tua domanda [1]: http: // stackoverflow.com/questions/5055540/order-by-countcolumns-not-null – yAnTar

risposta

20

Qualcosa di simile:

ORDER BY CASE 
    WHEN Column1 IS NOT NULL THEN Column1 
    ELSE Column2 
END 

stesso che scrivere:

ORDER BY IFNULL(Column1, Column2) 
+0

grazie mille. Non capisco questa frase NULL: "i valori appaiono in alto se ordinati in ordine crescente per tutti i NULL" puoi spiegare un po 'di più? – 1252748

+0

NULL è più piccolo di qualsiasi valore quando è ordinato in ordine ascendente. Se i tuoi dati sono '-1, 0, 1, NULL' il risultato dell'ordinamento crescente in' NULL, -1, 0, 1'. –

+0

questo 'ORDER BY CASE QUANDO COLONNA È NULL THEN Colonna2 ELSE Colonna1 END' mi sembra un po 'più chiaro. devo _ utilizzare per l'istruzione 'END'? – 1252748

1

Si potrebbe provare con il seguente:

ORDER BY ISNULL(firstField, secondField) 
+2

MySQL ISNULL restituisce 1/0, non la colonna non null (intendevi IFNULL?). –

4

Prova questa

ORDER BY COALESCE(fieldA, fieldB); 
0

Non ho alcuna tabelle atm in cui ho potuto provarlo, ma questo può funzionare, almeno lo ha fatto senza dati utilizzabili:

SELECT * FROM table1 
LEFT JOIN table2 ON table1.id = table2.id 
WHERE 1 
ORDER BY IF(table2.id, table1.id, table1.name) 

Anche io non so come l'ordine potrebbe apparire come se table2. id è nullo a volte, sembra molto instabile.

+0

Non c'è 'IF' in SQL (sicuramente non per Postgres) –