我正在尝试使用以下查询对表中的数据进行排序:
通过CUST desc
从客户订单中选择*所有参赛作品均已正确订购,但:CUST.10 如何使其正确排序,以便CUST.10显示在顶部,然后是CUST.9,CUST.8等等。
答案 0 :(得分:4)
试试这个:
SELECT *
FROM customers
ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC
工作示例:
SELECT * FROM
(
SELECT 'CUST.10' CUST
UNION
SELECT 'CUST.9' CUST
UNION
SELECT 'CUST.1' CUST
) A ORDER BY CAST(SUBSTRING_INDEX(CUST, '.', -1) AS SIGNED) DESC
答案 1 :(得分:1)
这是基于字符串值排序 - 而不是数字。 如果您可以将数字拆分为仅数字值 - 那么您可以对其进行排序。
答案 2 :(得分:1)
考虑将您附加到Cust字符串的数字放入整数列。现在,SQL正在varchar列CUST上进行字母数字排序。这会在每个字符索引处使用字母数字优先级进行排序。如果按整数列排序,您将得到您想要的结果。
答案 3 :(得分:0)
使用这种数据类型,你不能,字符串的自然排序(假设数据类型是字符串)导致10低于2 ... 因为它从第一个字符开始比较各个字符。第一个不相等的比较被视为解决方案。
要解决此问题,您必须使用其他一些数据字段或将其设为数字字段。
答案 4 :(得分:0)
不仅可以预测对字符串值进行排序,而且效率也很低。您应该考虑修改架构并为客户ID创建整数列。也可能是你已经把这个专栏作为一个关键字放在其他地方,然后肯定继续按照该专栏排序。
答案 5 :(得分:0)
您需要将名称拆分为名称和数字部分 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index
SELECT *
FROM CUSTTEST
ORDER BY
SUBSTRING_INDEX(CUST,'.',1),
1*SUBSTRING_INDEX(CUST,'.',-1) DESC
使用样本
create table CUSTTEST (CUST varchar(20));
insert CUSTTEST VALUES
('CUST.10'),('CUST.3'),('CUST.9'),('CUST.1'),
('BOB.11'),('BOB.13'),('BOB.2'),('BOB.5'),
('CYBERKIWI.11'),('CYBERKIWI.1');