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

MySQL ORDER BY appears to sort by hex and not alphabetically

我很难在此查询中进行排序

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'

这是推测性的,但我认为您想按街道号码及其名称排序,但您得到的是与数字不一致的词典顺序。一种选择是在将街道名称与其编号分开的排序中添加一个额外的级别,即

ORDER BY Strasse,
         Hausnummer,
         COALESCE(Buchstabe, ''),
         Name

请注意,在 MySQL 中,默认排序顺序为升序,因此您无需在任何地方都使用 ASC

为什么不干脆

ORDER BY
Strasse, Hausnummer, Buchstabe, Name;

concat 的结果是一个字符。这就是为什么您的顺序是词法的(30 在 6 之前)。如果您单独对列进行排序,Hausnummer 将被视为数字并按数字排序。如果两个 Hausnummers 相同,SQL 将在 Buchstabe 之后对这些条目进行排序。如果您使用 ASC,那么 NULL 值将排在第一位,顺便说一句,这是默认值。

在我看来,您的家人 Stang 可能居住在 30B Ahnherrnstraße。而 Meier 的家人可能在 30 Ahnherrnstraße

然后你会有其他人在 8 Ahnherrnstraße,例如。

我想你想按以下顺序显示这些。

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

要正确做到这一点,您不能在 ORDER BY 子句中将 Hausnummer 转换为字符串,否则它将按词法而不是数字排序。

你会想要ORDER BY Strasse, Hausnummer, COALESCE(Buchstabe,' '), Name

为什么 COALESCE(Buchstabe,' ')?您要确保带有 NULL Buchstabe 的项目排在第一位,在其他项目之前。 space 是第一个字符。如果你最后想要它们,请使用 COALESCE(Buchstabe,'~').