Comandă multi-coloană SQL cu ORDER BY

Am incercat aceasta:

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

Ordinea rândurilor în acest moment este:

 , ,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 răspunsuri

Ar trebui să utilizați COALESCE :

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

COALESCE is ANSI SQL Compatible, BTW.

6
adăugat
Nu pare să funcționeze. Ordinul este încă la fel ca cel original.
adăugat autor budwiser, sursa
Da, știu asta. Nu, câmpurile nu sunt nulă, ci doar goale. Am testat-o ​​cu valori NULL și asta-i tot. Lucrări.
adăugat autor budwiser, sursa
Sunt câmpurile goale setate la nul sau doar goale? (Știi că există o diferență corectă?)
adăugat autor Adrian Carneiro, sursa

Utilizați funcția ISNULL() . Dacă valoarea last_name este NULL , atunci va folosi valoarea company_name pentru a comanda.

ORDER BY ISNULL(last_name, company_name)

Dacă ultimul tău nume nu este NULL și doar un șir gol, poți folosi funcția NULLIF() pentru a înțelege acest lucru:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
adăugat
Mulțumesc Curt! A trebuit să utilizeze IFNULL în loc de ISNULL pentru MySQL, dar acest lucru a făcut truc.
adăugat autor budwiser, sursa
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
adăugat

Dacă utilizați Oracle, coloanele VARCHAR goale sunt tratate ca NULL. Apoi folosiți COALESCE sau NVL așa cum a fost sugerat mai sus.

De altfel, dacă există un șir gol în coloana dvs. (nu NULL), puteți utiliza ORDER BY CASE nume_cat WHEN '' THEN ... etc.

1
adăugat

Puteți adăuga o coloană suplimentară la interogare:

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
adăugat
MySQL - comunitatea Română
MySQL - comunitatea Română
12 participanți

Comunitatea română a programatorilor MySQL.