我有一个VARCHAR(255)
列的表格,其中包含以下字符串。
1
2
5
22
text
我需要规范化字符串并对它们进行排序。我在前面添加了0
,以便在订购时获得以下信息:
0001
0002
0005
0022
text
以下是查询:
SELECT right(concat('000000000000000000000000000000000000', test), 36)
FROM my_table
ORDER BY right(concat('000000000000000000000000000000000000', test), 36);
如果number_of_chars
调用中的right()
足够小(比如16),则顺序正确,但如果我使用36,则顺序不正确:字符5
出现在{{1}之前}。
2
问题:这种行为的原因是什么?这是一个错误吗?如何解决?
以下是我的表格:
000000000000000000000000000000000005
000000000000000000000000000000000002
我正在使用MySQL 5.7.15
答案 0 :(得分:2)
似乎在21 char之后,带字符串填充的右子字符串不起作用..但是 你可以使用简单的lpad这项工作也可以100或更多
SELECT test
FROM my_table
ORDER BY lpad(test,100, '0')
答案 1 :(得分:0)
这是高度可重复的,非常好奇。例如,这会产生错误的排序:
SELECT right(concat(repeat('0', 36), test), 36) as val
FROM (select 'abcd' as test union all
select '5' as test union all
select '2' as test union all
select '13' as test union all
select '10013' as test union all
select 'def' as test
) t
ORDER BY val ;
有趣的是,添加DESC
似乎可以解决问题,但ASC
却没有。
通常,在这种情况下,您希望数字首先跟随所有文本。您的版本将使用相同长度的数字散布非数字。
我建议使用单独的表达式执行此操作:
ORDER BY (left(test, 1) between '0' and '9') desc,
test + 0,
test
这种排序确实有效。
答案 2 :(得分:0)
您按顺序使用字符串,因此不会以不同的方式考虑数字n字符串。例如 你有11,12,01,03, 你会得到
01 11 12 03只是这样