Многоколоночное упорядочение SQL с ORDER BY - PullRequest
2 голосов
/ 27 октября 2011

Я пробовал это:

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



У меня есть таблица users, как это:

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

Порядок строк на данный момент:

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


Чего я хотел бы добиться, так это упорядочить строки в основном по last_name, но если он недоступен (пусто), упорядочить по company_name, но таким образом, чтобы он сравнивал этот столбец company_name с столбцами last_name ... Извините за возможные неточности объяснение. Вот порядок, который я хотел бы достичь:

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

РЕДАКТИРОВАТЬ: Это возможно с помощью одного запроса MySQL?

Ответы [ 5 ]

6 голосов
/ 27 октября 2011

Вы должны использовать COALESCE:

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

COALESCE является ANSI SQL-совместимым, кстати.

1 голос
/ 27 октября 2011

Если вы используете Oracle, пустые столбцы VARCHAR обрабатываются как NULL. Затем используйте COALESCE или NVL, как указано выше.

Иначе, если в вашем столбце есть пустая строка (не NULL), вы можете использовать ORDER BY CASE last_name WHEN '' THEN ... и т. Д.

1 голос
/ 27 октября 2011
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1 голос
/ 27 октября 2011

Используйте функцию 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)
0 голосов
/ 27 октября 2011

Вы можете добавить дополнительный столбец к запросу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...