MySQL ORDER BY似乎按十六进制排序,而不是按字母顺序排序

时间:2017-01-12 13:09:38

标签: mysql sql sql-order-by concat

我在这个查询中排序很困难

SELECT 
    Strasse,
    CONCAT(CAST(Hausnummer AS CHAR), COALESCE(Buchstabe, '')),
    Name
FROM
    Adresse
WHERE
    GebietID = 'G20141205064123101'
ORDER BY
Strasse ASC , CONCAT(CAST(Hausnummer AS CHAR), COALESCE(Buchstabe, '')) ASC , Name ASC;

concat用于连接数值和单个字符。 生成的列似乎基于HEX值而非实际字符串值进行排序。

有没有办法按字母顺序排序?

编辑: 以下是一些示例数据:

'A20141205235645111', 'G20141205064123101', 'Amberg', 'Ahnherrnstraße', '6', NULL, 'Meier Johann Olga'
'A20141205235645361', 'G20141205064123101', 'Amberg', 'Ahnherrnstraße', '30', NULL, 'Stang Lidija Swetlana Waldemar'
'A20141215182839021', 'G20141205064123101', 'Amberg', 'Ahnherrnstraße', '6', NULL, 'MANFRED1'

结果:

'Ahnherrnstraße', '30', 'Stang Lidija Swetlana Waldemar'
'Ahnherrnstraße', '6', 'MANFRED1'
'Ahnherrnstraße', '6', 'Meier Johann Olga'

3 个答案:

答案 0 :(得分:2)

为什么不简单

ORDER BY
Strasse, Hausnummer, Buchstabe, Name;

concat的结果是一个角色。这就是为什么你的订购是词汇(在6之前30)。如果您单独订购列,则将Hausnummer视为数字并按数字排序。如果两个Hausnummers相同,SQL将在Buchstabe之后对这些条目进行排序。如果你使用ASC,那么将首先出现NULL值,顺便说一下,这是默认值。

答案 1 :(得分:0)

这是具体的,但我认为你想按街道号码和他们的名字排序,但是你得到的是一个不符合数字条件的词汇顺序。一种选择是在排序中增加一个额外的级别,将街道名称与其号码分开,即

ASC

请注意,在MySQL中,默认排序顺序是升序,因此您无需在任何地方使用data.table

答案 2 :(得分:0)

让我觉得你有Stang家人住在30B Ahnherrnstraße。家人Meier可能是30 Ahnherrnstraße

然后,您将在8 Ahnherrnstraße处找到其他人。

我想您想按以下顺序显示这些内容。

 8 Ahnherrnstraße
 30 Ahnherrnstraße
 30B Ahnherrnstraße

为了正确地执行此操作,您不能在Hausnummer子句中将ORDER BY转换为字符串,或者它将按词汇顺序排序而不是数字排序。

您需要ORDER BY Strasse, Hausnummer, COALESCE(Buchstabe,' '), Name

为什么COALESCE(Buchstabe,' ')?你想要确保你的项目有一个NULL Buchstabe优先于其他项目。空间是第一个角色。如果您需要最后一次,请使用COALESCE(Buchstabe,'~')