如何对包含数字、字母和字符的 varchar 列(SQL)进行排序?

3
“Order by” 返回以下结果:
05
05/1-1
05/1-2
05/1-3
05/1-4
05/1-5
05/1-6
05/1-7
05/1
05/2-1
05/2-2
05/2-3
05/2-4
05/2
05/3
05/4
而以下顺序是正确的:
05
05/1
05/1-1
05/1-2
05/1-3
05/1-4
05/1-5
05/1-6
05/1-7
05/2
05/2-1
05/2-2
05/2-3
05/2-4
05/3
05/4
有没有办法实现这个排序方式?
4个回答

1
如果可能的话,请尝试将数据拆分,使得任何数字信息都在自己的字段中。 字符串数据和数字数据混合在一个字段中总是会导致字符串类型的数据,因此'A2' > 'A11'。

1

您需要将varchar数据转换为数字数据类型,然后对数据执行排序操作。

您可能还需要拆分数据字符串,因此示例order by子句可能是:

order by 
convert(int,left(columnName,2)) asc, 
convert(int,subtring(columnName,4`,2)) 

这将取决于哪些字符串元素代表哪些日期组件。
明白吗?

0

修改表并添加比较列。编写一个小程序,读取字符串并将其转换为数据库可以转换的格式。在您的情况下,我猜日期是一个不错的选择。

一般情况下,使用VARCHAR列,并将所有数字格式化为五位数或更多位数(带有前导零/空格,即右对齐)。

之后,您可以使用比较列来排序数据。


0

如果我是你,我会用一个巧妙的表达式进行排序。假设在斜杠之前最多有2或3个数字。如果你写:

order by case charindex('/', val)
           when 0 then convert(int, val)
           else convert(int, substr(val, 1, charindex('/', val) -1)
         end * 1000
           + case charindex('/', val)
               when 0 then 0
               else convert(float, replace(substring(val, 1 + charindex('/', val),
                                                     length(val)), '-', '.'))
             end

如果我没有打错任何东西,以下内容应该将05转换为5000,05/1转换为5001,05/1-1转换为5001.1,并且按照您想要的方式进行排序,假设您在连字符后最多只有一位数字。否则,您可以通过拆分并使用适当数量的零进行左填充来解决它,但表达式会变得更加丑陋...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接