我目前在表列中有字符值,其格式为“IS-”,然后是 1 到 5 个数字,可能是句点,句点后面有 2 个数字或一个字母。
Examples are, 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,但我不太确定如何继续。
谢谢。
最佳答案
在 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)
关于SQL 对分割后的数字字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740997/