SQL-bestelling met meerdere kolommen met ORDER BY

Ik heb dit geprobeerd:

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            |
+------------------+--------------------+--------------------+

De volgorde van de rijen op dit moment is:

 , ,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 antwoord

U moet COALESCE gebruiken:

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

COALESCE is ANSI SQL Compatible, BTW.

6
toegevoegd
Lijkt niet te werken. De volgorde is nog steeds dezelfde als mijn oorspronkelijke bestelling.
toegevoegd de auteur budwiser, de bron
Ja, daar ben ik me van bewust. Nee, de velden zijn niet leeg, gewoon leeg. Ik heb het met NULL-waarden getest en dat is alles. Werken.
toegevoegd de auteur budwiser, de bron
Zijn de lege velden ingesteld op nul of gewoon leeg? (Weet je dat er een verschil is?)
toegevoegd de auteur Adrian Carneiro, de bron

Gebruik de functie ISNULL() . Als de waarde achternaam NULL is, gebruikt deze in plaats daarvan de waarde bedrijfsnaam om te bestellen.

ORDER BY ISNULL(last_name, company_name)

Als uw achternaam niet NULL is en slechts een lege tekenreeks, kunt u de functie NULLIF() gebruiken om dit probleem te omzeilen:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
toegevoegd
Bedankt Curt! Had IFNULL moeten gebruiken in plaats van ISNULL voor MySQL, maar dit lukte.
toegevoegd de auteur budwiser, de bron
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
toegevoegd

Als u Oracle gebruikt, worden lege VARCHAR-kolommen behandeld als NULL. Gebruik vervolgens COALESCE of NVL zoals hierboven gesuggereerd.

Anders, als er een lege string in uw kolom staat (niet NULL), kunt u ORDER BY CASE gebruiken achternaam WHEN '' DAN ... etc.

1
toegevoegd

U kunt een extra kolom aan de query toevoegen:

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
toegevoegd