2012-06-29 37 views
0

我在列字段看起來像這樣:如何在Column不是同一類型時按列排序?

2/8B, 3, 3/8B, 4/8B, 2, 6, 4/9, 9, 8/9, 8, 7, 1, 5/9, 10, 3/9, 2/9, 7/9, 6/8B, 6/9, 1/9, 5, 8B, 5/8B, 4 

我需要在這樣的方式對此列表進行排序:

1, 1/9, 2, 2/8B, 2/9, 3, 3/8B, 3/9, 4, 4/8B, 4/9, 5, 5/8B, 5/9, 6, 6/8B, 6/9, 7, 7/9, 8, 8/9, 8B, 9, 10 

如何以便通過創建這個輸出?

清除任何混淆(1/2)不是分數。 「/」只是一個分隔符。

+1

如果您提供了更大的排序示例,將會有所幫助 – Jake1164

+0

「當列不是同一類型時」是什麼意思?一列只能是一種類型。 –

+0

對不起,這裏是一個更大的樣本'10','4','4/9','5','9','5/9' – kyle

回答

0

我不明白;使用您提供的字符可以按您要求的順序排序。給它一個鏡頭:

SELECT Test 
FROM (
    SELECT '38a' AS Test 
    UNION 
    SELECT '1' 
    UNION 
    SELECT '1/2' 
    UNION 
    SELECT '12' 
) MyData 
ORDER BY Test ASC 

編輯現在

,你已經給了具體的例子,我看這是108B是扔東西了。嘗試這個代替:

SELECT YourCol 
FROM YourTable 
ORDER BY CAST(REPLACE(REPLACE(REPLACE(YourCol, 'B', '.99'), '/', '.'), 
    '.8.99', '.899') AS NUMERIC(18, 4)) 

這將它順序:

1,1/9,2,2/8B,2/9,3,3/8B,3/9,4 ,4/8B,4/9,5,5/8B,5/9,6,6/8B,6/9,7,7/9,8,8/9,8B,9,10 10

這是醜陋的,但它的作品。如果除B之外還有其他字母,則必須更改腳本以處理該問題。

+0

對不起,使用樣本'10','4','4/9','5','9','5/9。結果是不正確的。 – kyle

+0

1,1/9,10,2,2/8B,2/9,3,3/8B,3/9,4,4/8B,4/9,5,5/8B,5/9,6 ,6/8B,6/9,7,7/9,8,8/9,8B,9 – kyle

+0

@Kyle - 是你想要的排序順序嗎?用更好的例子和定義的排序順序編輯你的問題。 – LittleBobbyTables

0

我假設你正在排序由列是一個字符數據類型(因爲一些值都是非數字字符) - 這樣一個簡單的ORDER BY將工作

select '38a' as value 
union 
select '12' 
union 
select '1/2' 
union 
select '1' 
order by value 

不這給你你正在尋找的結果?

0

您可以使用的一個技巧是從您的字符串中提取前導整數,按整數值排序,然後按字符串排序。

我不知道任何「簡單」的方式來做到這一點在SQL Server中(即不建立一個函數)。

使用本機內置SQL Server函數執行此操作的一種方法是使用PATINDEX函數來搜索「位數」和「非位數」的起始位置,然後使用這些值確定領導的長度整數。使用SUBSTRING和CONVERT函數來提取前導整數值。

它不漂亮:

ORDER BY 
    CASE WHEN PATINDEX('[0-9]%', t.str) = 1 
    THEN 
     CASE WHEN PATINDEX('%[^0-9]%', t.str) > 0 
     THEN CONVERT(INTEGER,SUBSTRING(t.str ,1,PATINDEX('%[^0-9]%', t.str)-1)) 
     ELSE CONVERT(INTEGER, t.str) 
     END 
    ELSE NULL 
    END 
, t.str 

注:

t.str是返回的字符串值表達式中的佔位符。

這符合您的測試用例中給出的所有值的指定要求。

此外,這樣做而不是當遇到「意外」值時拋出異常(即導致語句失敗),例如空字符串「'或沒有前導整數的字符串。

這隻處理字符串的「前導整數」部分。之後的所有內容都作爲字符串進行比較。 (這意味着例如'6/10B'將在'1/8B'之前排序,因爲'/ 1'<'/ 8'。

對於整數比較,前導整數值的任何前導零將被忽略, (這意味着例如'05/9'將在'5/8'之前排序,因爲5 = 5但'0'<'5')

任何沒有的字符串值一個前導數字將被分配一個整數值爲NULL的排序操作,所以這些將首先排序

1

這個問題充滿了問題,基本上你試圖編寫一個排序函數,可以看看這些字符串,並使人類對它們的解釋意味着命名模式最終會以任何人理解的方式改變,但是你的代碼不會,然後你就有了一個錯誤。

我不知道你怎麼不走這條路。但是儘可能地保衛並提醒和提升。

+0

+1關於「捍衛和警告」的優點。所選答案有一個SQL表達式,當遇到意外的值時將拋出異常(FAIL)。最好是防守編碼,驗證數據是否符合輸入規範,而不是在幾年後的最不合時宜的時間開始查詢開始莫名其妙地開始失敗。 – spencer7593

相關問題