我目前的SQl声明是:
SELECT distinct [Position] FROM [Drive List] ORDER BY [Position]ASC
输出的排序如下:
1_A_0_0_0_0_0
1_A_0_0_0_0_1
1_A_0_0_0_0_10
1_A_0_0_0_0_11
1_A_0_0_0_0_12
1_A_0_0_0_0_13 - 1_A_0_0_0_0_24, and then 0_2-0_9
字段类型是Microsoft Access数据库中的文本。为什么订单混乱,有没有正确排序值的方法?
答案 0 :(得分:2)
“为什么订单混乱”:
订单只是乱七八糟,因为你正在用你的人脑进行编译并且正在应用比计算机更多的价值,因为你象征性地理解了这些值所代表的含义。解析输出就好像你只能将它理解为一个字符串数组,并且你试图确定哪个字符串是最大的,同时对每个字符的符号值一无所知。您会发现您的查询生成的输出完全符合逻辑,而且完全没有混乱。
“任何正确排序值的方法”
这是一个设计问题,如果确实存在问题,应予以解决。
Change 1_A_0_0_0_0_0 to 1_A_0_0_0_0_00
Change 1_A_0_0_0_0_1 to 1_A_0_0_0_0_01
Change 1_A_0_0_0_0_2 to 1_A_0_0_0_0_02
etc
这会使问题消失。
使用这两个单独的查询:
SELECT distinct [Position] FROM [Drive List] WHERE [Position] LIKE '1_A_0_0_0_0_?' ORDER BY [Position] ASC
SELECT distinct [Position] FROM [Drive List] WHERE [Position] LIKE '1_A_0_0_0_0_??' ORDER BY [Position] ASC
...添加到临时表并追加以使结果正确显示。
答案 1 :(得分:1)
您的混乱订单是因为它是文本字段而导致的。对于解决方案,您可以尝试在表中添加一个数字的附加列,并按其而不是位置排序。我需要更多关于您拥有哪些数据的信息以及建议这样做的好方法。
答案 2 :(得分:1)
如果您想要包含这些子串的数值的排序,您可以将它们转换为数字。
在最简单的情况下,您只关注第12个字符后面的数字。这种情况相当容易。
SELECT
sub.Position,
Left(sub.Position, 12) AS sort_1,
Val(Mid(sub.Position, 13)) AS sort_2
FROM
(
SELECT DISTINCT [Position] FROM [Drive List]
) AS sub
ORDER BY 2, 3;
或者,如果您只想显示Position
字段,可以这样做......
SELECT
sub.Position
FROM
(
SELECT DISTINCT [Position] FROM [Drive List]
) AS sub
ORDER BY
Left(sub.Position, 12),
Val(Mid(sub.Position, 13));
但是,您的实际情况可能更具挑战性......也许最初的子字符串(包括最终_
字符在内的所有字符串)并不总是12个字符长,和/或包括您也是想要按数字排序。然后,您可以混合使用InStr()
,Mid()
和Val()
表达式来解析要排序的值。但是这个任务真的很快就会变得可怕!改变存储的值可能会更少,因此它们按照@Justin建议的字符顺序正确排序。
答案 3 :(得分:0)
这是字符串的正确排序。 按字母顺序排在第10位之前。
对于最后一个号码的订单,您可以尝试使用SUBSTRING和CAST(或CONVERT)命令