ORDER BYを使用したSQLの複数列の並べ替え

私はこれを試した:

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,
空のフィールドはnullまたは空白に設定されていますか? (違いがあるのは分かっていますか?)
追加された 著者 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
追加された
ありがとうございました! MySQLのためにISNULLの代わりにIFNULLを使用しなければなりませんでしたが、これはやりました。
追加された 著者 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
追加された