SQL 对分割后的数字字符串进行排序

标签 sql sql-server-2008

我目前在表列中有字符值,其格式为“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/

相关文章:

MAX 之前的 MySQL SELECT 值

MySQL 左连接?

c# - 插入、子查询、值

Postgresql 链接服务器查询非常慢

sql - 在 Sql Server 2008 中记录所有用户请求操作 : (inserts, 更新、删除的最佳方法是什么?

sql - 如何在 MS-SQL 中对同一列的不同值使用计数函数?

sql-server - 从 .bak 文件恢复选定的表

c# - ADO 异步查询超时

sql - 禁用与特定表关联的所有外键约束

sql - 基于另一个查询的值的不同查询的相交或公共(public)值