ORDER BY ile SQL çoklu sütun siparişi

Bunu denedim:

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

Şu anda satırların sırası:

 , ,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 cevap

COALESCE kullanmalısınız:

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

COALESCE is ANSI SQL Compatible, BTW.

6
katma
Çalışmıyor gibi gözüküyor. Sipariş hala orijinalimle aynı.
katma yazar budwiser, kaynak
Evet, bunun farkındayım. Hayır, alanlar boş değil, boş değil. NULL değerleri ile test ettim ve bu kadar. Eserleri.
katma yazar budwiser, kaynak
Boş alanlar null olarak mı yoksa boş mu gösteriliyor? (Farkın doğru olduğunu biliyor musun?)
katma yazar Adrian Carneiro, kaynak

ISNULL() işlevini kullanın. last_name değeri NULL ise, bunun yerine sipariş için şirket_adı değerini kullanır.

ORDER BY ISNULL(last_name, company_name)

Son_name NULL değil ve sadece boş bir dize ise, bu konuda almak için NULLIF() işlevini kullanabilirsiniz:

ORDER BY ISNULL(NULLIF(last_name,''), company_name)
1
katma
Teşekkürler Curt! MySQL için ISNULL yerine IFNULL kullanmak zorunda kaldı, ama bu hile yaptı.
katma yazar budwiser, kaynak
SELECT * FROM your_table
ORDER BY COALESCE(last_name, company_name)
1
katma

Oracle kullanıyorsanız, boş VARCHAR sütunları NULL olarak kabul edilir. Ardından, yukarıda önerildiği gibi COALESCE veya NVL kullanın.

Eğer kolonunuzda boş bir dize varsa (NULL değil), ORDER BY CASE last_name '' SONRA ... vb.

1
katma

Sorguya fazladan bir sütun ekleyebilirsiniz:

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
katma