2010-12-22 230 views
4

我正在使用mySQL。我必須按姓氏排列聯繫人姓名,但在沒有姓氏的情況下,我按名字排序。SQL:ORDER BY兩列混合,不是基於優先級

這看起來像:

ORDER BY lastname = "", lastname, firstname 

然而,這使得與lastnames的那些出現在頂部。我想要的行爲是混合第一個和最後一個名字,就像他們來自同一個領域。

例(假裝這些名字):

A,T 
Z,G 
A 
B 
C 

對戰:

A 
A,T 
B 
C 
Z,G 

感謝

+0

是姓氏值零或零長度字符串? – 2010-12-22 19:17:36

回答

16

使用COALESCENULLIF

ORDER BY COALESCE(NULLIF(LastName, ''), FirstName), FirstName 
7

嘗試使用Coalesce
注:這可能需要你不要存放空的末尾名稱使用空字符串(即「」)

ORDER BY Coalesce(LastName, FirstName) 

建議在評論中通過添加名字到訂單再次列表您將正確地訂購具有相同姓氏的兩個人。這是一個例子。

ORDER BY Coalesce(LastName, FirstName), FirstName 
+0

...並在此之後再添加一個名字,以便兩個具有相同姓氏的聯繫人將被正確排序。 – Axel 2010-12-22 19:14:29

+0

@Axel好點。 – 2010-12-22 19:15:30

+0

我剛剛嘗試過,聯繫人現在看起來幾乎是隨機排列的。在合併之前肯定更有組織...... – Tyler 2010-12-22 19:16:45

3

ORDER BY支持自定義排序。但是根據你的邏輯,我建議在你的SELECT中使用CONCAT創建一個字段,然後對其進行排序。

SELECT *, IF(LENGTH(lastname) = 0, firstname, CONCAT(lastname, ', ', firstname)) AS fullname 
FROM contacts 
ORDER BY fullname; 

這也有基於相同的排序邏輯在搜索結果中返回fullname的利益。

0
ORDER BY 
CASE 
    WHEN LName is null 
    THEN FName 
    ELSE LName 
    END 

here