我認爲有效的方法是在使用劈裂列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')表示這應該是兩個單獨的列。您可能希望在表格設計中更改此類查詢,並且像這裏所需的查詢將變得非常簡單。 –
我同意,因爲破折號後面的數字是一個版本號。但是太多的東西依賴於目前的設置,我不認爲我有時間去改變它。 –
一般情況。不幸的是,它通常甚至更多*將來依賴它的東西,所以它變得越來越糟。一個選項可能是引入單獨的列,並使組合編號成爲計算列。 –