SQL:按两列混合排序,不基于优先级
我正在使用mySQL。我必须按姓氏排列联系人姓名,但如果没有姓氏,我就按姓氏排列 这看起来像:SQL:按两列混合排序,不基于优先级,sql,mysql,Sql,Mysql,我正在使用mySQL。我必须按姓氏排列联系人姓名,但如果没有姓氏,我就按姓氏排列 这看起来像: ORDER BY lastname = "", lastname, firstname 但是,这会使具有姓氏的出现在顶部。我喜欢的行为是混合名字和姓氏,就像它们来自同一个领域一样 示例(假设这些是名称): 与: A A,T B C Z,G 谢谢尝试使用 注意:这要求您不要使用空字符串(即“”)存储空姓氏。 ORDER BY Coalesce(LastName, FirstName) 按照评论中的
ORDER BY lastname = "", lastname, firstname
但是,这会使具有姓氏的出现在顶部。我喜欢的行为是混合名字和姓氏,就像它们来自同一个领域一样
示例(假设这些是名称):
与:
A
A,T
B
C
Z,G
谢谢尝试使用注意:这要求您不要使用空字符串(即“”)存储空姓氏。
ORDER BY Coalesce(LastName, FirstName)
按照评论中的建议,通过再次将FirstName添加到orderby列表中,您将正确地为两个姓氏相同的人排序。这里有一个例子
ORDER BY Coalesce(LastName, FirstName), FirstName
orderby
支持自定义排序。但考虑到您的逻辑,我建议您使用CONCAT
在SELECT
中创建一个字段,然后对其进行排序
SELECT *, IF(LENGTH(lastname) = 0, firstname, CONCAT(lastname, ', ', firstname)) AS fullname
FROM contacts
ORDER BY fullname;
这还有一个好处,就是根据相同的排序逻辑在结果中返回fullname
ORDER BY
CASE
WHEN LName is null
THEN FName
ELSE LName
END
更多使用和:
…然后再次添加Firstname,这样两个姓氏相同的联系人将被正确排序。我刚刚尝试了这一点,现在联系人看起来几乎是随机排序的。在合并之前,它肯定更有条理……我根据阿克塞尔的建议尝试了一下,它看起来和按姓氏、姓氏排序的顺序一样。我在查询中连接了几个表,如果这有关系的话。@Tyler我刚刚在一个示例表上运行了它,它按预期工作了吗?所以我对你之前的陈述感到非常困惑。@Tyler这篇专栏有一个简单的方法
updateyourtable set lastname=null,其中lastname=''
注意,将数据输入数据库的任何内容都需要更新。lastname值是null还是长度为零的字符串?这没有给出所需的结果。可能是因为我用“”代替null.+1,尽管我不同意在姓氏列中使用空字符串。我同意你的解决方案对OP的问题有效这就是问题所在!!对第一个解决方案进行了很好的调整,因此它可以在空字段上工作。+1很好的解决方案…我甚至没有想到…但我仍然不同意空字符串值。@John Hartsock-这取决于数据库设计和商店惯例。我同意,一般来说,我希望像贝利这样的人的姓氏为“”(已知为空),办公空间中鲍勃的姓氏为空(未知,但假设可能存在)。但是,在这种情况下,我认为所需的排序行为没有区别。
ORDER BY
CASE
WHEN LName is null
THEN FName
ELSE LName
END
ORDER BY COALESCE(NULLIF(LastName, ''), FirstName), FirstName