我认为有效的方法是在使用劈裂列Order By
模式:
CREATE TABLE #TAB (VARCHARCOLUMN VARCHAR(20))
INSERT INTO #TAB
SELECT '1060006-1'
UNION ALL
SELECT '1060006-10'
UNION ALL
SELECT '1060006-11'
UNION ALL
SELECT '1060006-12'
UNION ALL
SELECT '1060006-13'
UNION ALL
SELECT '1060006-15'
UNION ALL
SELECT '1060006-16'
UNION ALL
SELECT '1060006-17'
UNION ALL
SELECT '1060006-18'
UNION ALL
SELECT '1060006-19'
UNION ALL
SELECT '1060006-20'
UNION ALL
SELECT '1060006-2'
现在,通过-
并获得拆分份数的VARCHAR列订单
SELECT VARCHARCOLUMN
,CAST(SUBSTRING(VARCHARCOLUMN,1,CHARINDEX('-', VARCHARCOLUMN)-1) AS BIGINT) AS PART1
,CAST(SUBSTRING(VARCHARCOLUMN,CHARINDEX('-', VARCHARCOLUMN)+1,LEN(VARCHARCOLUMN)) AS INT) AS PART2
FROM #TAB
ORDER BY PART1, PART2
这将返回
+---------------+---------+-------+
| VARCHARCOLUMN | PART1 | PART2 |
+---------------+---------+-------+
| 1060006-1 | 1060006 | 1 |
| 1060006-2 | 1060006 | 2 |
| 1060006-10 | 1060006 | 10 |
| 1060006-11 | 1060006 | 11 |
| 1060006-12 | 1060006 | 12 |
| 1060006-13 | 1060006 | 13 |
| 1060006-15 | 1060006 | 15 |
| 1060006-16 | 1060006 | 16 |
| 1060006-17 | 1060006 | 17 |
| 1060006-18 | 1060006 | 18 |
| 1060006-19 | 1060006 | 19 |
| 1060006-20 | 1060006 | 20 |
+---------------+---------+-------+
您所感兴趣的两个独立的字符串(你要正确对待字符串“1060006-2”,就好像它在两个号码1060006和2个或两个字符串“1060006 '和'02')表示这应该是两个单独的列。您可能希望在表格设计中更改此类查询,并且像这里所需的查询将变得非常简单。 –
我同意,因为破折号后面的数字是一个版本号。但是太多的东西依赖于目前的设置,我不认为我有时间去改变它。 –
一般情况。不幸的是,它通常甚至更多*将来依赖它的东西,所以它变得越来越糟。一个选项可能是引入单独的列,并使组合编号成为计算列。 –