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
додано
Спасибі Курт! Необхідно використовувати 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 WHEN '' 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
додано