一尘不染

拆分后SQL对数字字符串排序

sql

我目前在一个表格列中有char值,其格式为“ IS-”,然后是1到5个数字,可能的句点可以是2个数字,也可以是一个字母。

示例为IS-1,IS-12,IS-123,IS-123.11,IS-123.a。

我需要分割字符串,以便仅抓取数字部分,对字符串ASC进行排序,然后将字符串重新组合在一起。

解释。我有以下一组值,IS-1170, IS-1171, IS-1172, IS-1173, IS-1174, IS-870.a, IS-871.a, IS-872.a.如您所见,因为IS-1在IS-8之前,所以它们按数字顺序排序。

知道从哪里开始吗?我当时在考虑使用CASE,但我不确定如何继续。

谢谢。


阅读 442

收藏
2021-03-08

共1个答案

一尘不染

在您的字符串函数中ORDER BY仅删除数字。这样的事情应该起作用:

SELECT col
FROM table
ORDER BY CAST(CASE WHEN ISNUMERIC(SUBSTRING(col,4,20)) = 1
              THEN SUBSTRING(col,4,20)
              ELSE LEFT(SUBSTRING(col,4,20),CHARINDEX('.',SUBSTRING(col,4,20),0)-1)
         END AS NUMERIC)

这将首先删除IS-和检查字符串的其余部分是否为数字。如果是这样,它将保留小数位数,否则将删除.和后面的字母字符。

假设在数字小数位的情况下,您预期的顺序为:

IS-123.A
IS-123.1
IS-123.2

如果您不关心小数点/句号后面的内容,则只需:

ORDER BY CAST(LEFT(SUBSTRING(col,4,20),CHARINDEX('.',SUBSTRING(col,4,20),0)-1) AS NUMERIC)
2021-03-08