SQL ўпарадкаванне некалькіх слупкоў з ORDER BY

Я паспрабаваў гэта:

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

Парадак радкоў на дадзены момант:

 , ,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 адказы

Вы павінны выкарыстоўваць 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
дададзена
Не падобна на працу. Парадак па-ранейшаму такі ж, як мой арыгінал.
дададзена аўтар budwiser, крыніца
Так, я ведаю пра гэта. Не, гэтыя палі не роўна нулю, проста пустым. Я тэставаў яго з NULL значэннямі і гэта ўсё. Працуе.
дададзена аўтар budwiser, крыніца
Ёсць пустыя палі усталёўваецца ў нулявы значэнне або проста пусты? (Вы ведаеце, што ёсць розніца ці не так?)
дададзена аўтар Adrian Carneiro, крыніца

Выкарыстоўвайце ISNULL() <�код /> функцыі. Калі last_name значэнне NULL , то ён будзе выкарыстоўваць company_name значэнне для замовы замест.

ORDER BY ISNULL(last_name, company_name)

Калі last_name ня NULL, а проста пустая радок, вы можаце выкарыстоўваць функцыю NULLIF (), каб абыйсці гэтую праблему:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
дададзена
Дзякуючы Curt! Давялося выкарыстоўваць IFNULL замест ISNULL для MySQL, але гэта зрабіў трук.
дададзена аўтар budwiser, крыніца
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
дададзена

Калі вы выкарыстоўваеце Oracle, пустыя слупкі VARCHAR разглядаюцца як NULL. Затым выкарыстоўвайце COALESCE або NVL , як было прапанавана вышэй.

У адваротным выпадку, калі ёсць пусты радок у слупку (не NULL), вы можаце выкарыстоўваць ORDER BY CASE, last_name КАЛІ «» THEN ... і г.д.

1
дададзена

Вы можаце дадаць дадатковы слупок ў запыце:

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
дададзена