如何通过SQL中包含int的文本列进行排序?

时间:2013-12-20 19:41:16

标签: sql sorting ms-access

我目前的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数据库中的文本。为什么订单混乱,有没有正确排序值的方法?

4 个答案:

答案 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)命令