2010-12-22 192 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