SQL mehrspaltige Sortierung mit ORDER BY

Ich habe es versucht:

SELECT first_name,last_name,company_name FROM users ORDER BY last_name, company_name ASC



I have a users table like this:

+------------------+--------------------+--------------------+
| first_name       | last_name          | company_name       |
+------------------+--------------------+--------------------+
| Alfa             | Alfa               | Bravo              |
+------------------+--------------------+--------------------+
| Echo             | Echo               | Alfa               |
+------------------+--------------------+--------------------+
| Delta            | Delta              |                    |
+------------------+--------------------+--------------------+
|                  |                    | Charlie            |
+------------------+--------------------+--------------------+

Die Reihenfolge der Zeilen im Moment ist:

 , ,Charlie
Alfa, Alfa, Bravo
Delta, Delta,
Echo, Echo, Alfa


What I would like to achieve, is to order rows primarily by last_name but if it's not available (empty), order by company_name but in a way that it still compares this company_name-column with the last_name-columns... Sorry for possible inaccurate explanation. Here is the order I'd like to achieve:

Alfa, Alfa, Bravo
 , ,Charlie
Delta, Delta,
Echo, Echo, Alfa

EDIT: Is this possible via a single MySQL query?

2

5 Antworten

Sie sollten COALESCE verwenden:

SELECT first_name,last_name,company_name 
FROM users ORDER BY coalesce(last_name, company_name) ASC

COALESCE is ANSI SQL Compatible, BTW.

6
hinzugefügt
Scheint nicht zu funktionieren. Die Reihenfolge ist immer noch die gleiche wie meine ursprüngliche.
hinzugefügt der Autor budwiser, Quelle
Ja, ich bin mir dessen bewusst. Nein, die Felder sind nicht null, nur leer. Ich habe es mit NULL-Werten getestet und das war's. Funktioniert.
hinzugefügt der Autor budwiser, Quelle
Sind die leeren Felder leer oder leer? (Sie wissen, dass es einen Unterschied gibt, oder?)
hinzugefügt der Autor Adrian Carneiro, Quelle

Verwenden Sie die Funktion ISNULL() . Wenn der Wert last_name NULL ist, wird stattdessen der Wert company_name für die Bestellung verwendet.

ORDER BY ISNULL(last_name, company_name)

Wenn Ihr last_name nicht NULL und nur eine leere Zeichenfolge ist, können Sie die NULLIF() - Funktion verwenden, um dies zu umgehen:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
hinzugefügt
Danke Curt! Ich musste IFNULL anstelle von ISNULL für MySQL verwenden, aber das war der Trick.
hinzugefügt der Autor budwiser, Quelle
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
hinzugefügt

Wenn Sie Oracle verwenden, werden leere VARCHAR-Spalten als NULL behandelt. Verwenden Sie dann COALESCE oder NVL wie oben vorgeschlagen.

Sonst, wenn es eine leere Zeichenfolge in Ihrer Spalte (nicht NULL) gibt, können Sie ORDER BY CASE last_name WENN '' DANN ... usw. verwenden

1
hinzugefügt

Sie können der Abfrage eine zusätzliche Spalte hinzufügen:

SELECT first_name,last_name,company_name,
case when last_name is null 
then company_name
else last_name
end as ord 
FROM users ORDER BY ord  ASC
0
hinzugefügt