2017-04-04 70 views
0
SELECT varcharColumn 
FROM tableA 
ORDER BY varcharColumn ASC 

給我排序包含數字與破折號VARCHAR列(1060006-19)

1060006-1 
1060006-10 
1060006-11 
1060006-12 
1060006-13 
1060006-15 
1060006-16 
1060006-17 
1060006-18 
1060006-19 
1060006-20 
1060006-2 

我要的是

1060006-1 
1060006-2 
1060006-3 

可以通過實現這個?或者我需要更多的東西?

使用這個給我在下面的圖片結果:

ORDER BY 
CASE WHEN varcharcolumn like '%-%' THEN 1 ELSE 2 END, 
LEN(varcharcolumn) 

enter image description here

+0

您所感興趣的兩個獨立的字符串(你要正確對待字符串「1060006-2」,就好像它在兩個號碼1060006和2個或兩個字符串「1060006 '和'02')表示這應該是兩個單獨的列。您可能希望在表格設計中更改此類查詢,並且像這裏所需的查詢將變得非常簡單。 –

+0

我同意,因爲破折號後面的數字是一個版本號。但是太多的東西依賴於目前的設置,我不認爲我有時間去改變它。 –

+0

一般情況。不幸的是,它通常甚至更多*將來依賴它的東西,所以它變得越來越糟。一個選項可能是引入單獨的列,並使組合編號成爲計算列。 –

回答

4

我認爲有效的方法是在使用劈裂列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 | 
+---------------+---------+-------+ 
1
ORDER BY 
CASE WHEN varcharcolumn like '%-%' THEN 1 ELSE 2 END, 
LEN(varcharcolumn), varcharcolumn 

這樣你會得到那些有短線上方第一;那麼LEN(XX)部分是這樣的,1-10不會在1-10之後出現,而不需要轉換爲十進制。您可以隨意刪除按長度排序

如果您只想用短劃線出現,那麼也許您應該做一個where子句。

+0

似乎沒有工作,上面添加了圖片。 –

+0

我得到了您的預期輸出。如果你只想要那些帶有' - '的東西出現,你需要的是一個WHERE子句@JackReilly –

+0

我認爲這種差異是因爲你按照長度排序,並且當它們有相同的長度時讓系統決定。我建議在'order by'子句中加入',varcharcolumn'。 –

0

Bennioe把我放在正確的道路上。最後,這讓我獲得了我想要的輸出。

SELECT varcharcolumn 
FROM TableA 
order by LEN(varcharcolumn) asc, varcharcolumn asc 

enter image description here

+2

......只有當所有的字符串以相同的數字(例如1060006)開頭時,它才起作用。 –

+2

您是否使用此數據測試過:'1060006-1','1060005-1','1060006-10','1060005-10'? –

+0

@ThorstenKettner短劃線之後的數字是一個版本號,所以它不會正確嗎? 1060006-1,1060006-2,1060007-1,1060007-2? –