2012-09-21 18 views
6

我有這個數據填充一個名爲Number列(列類型爲nchar):訂單僅一個字符串的數字部分

1 
2 
1091 
3 
20 
2B 

我想,讓這個命令的select語句:

1 
2 
2B 
3 
20 
1091 

我該如何做到這一點?謝謝大家的幫助

(編者)

+0

什麼是列類型? – NicoRiff

+3

將值從2B更改爲3B的訂單? –

+0

在第一部分中,第二部分3B中有2B。錯字? –

回答

17

可以通過轉換爲數字,你發現的第一個非的位置後執行一些技巧-數字。即使原始字符串不包含字母,最後添加一個隨機字符也會使所有字符串都相同。

SELECT [Number] FROM dbo.TableName 
ORDER BY CONVERT(INT, LEFT(Number, PATINDEX('%[^0-9]%', Number + 'z')-1)); 
+0

謝謝Aaron。可愛的作品。 – BernieSF

+0

亞倫 - 我認爲讓未來的訪問者使用正確的術語是非常重要的。有時,文檔鏈接是一種獎勵,這種情況幾乎是必需的。搜索'Sql Server'和'convert'會產生很多錯誤的結果。我認爲*它會轉換爲整數。你的表達中的'-1'完全令我困惑。如果代碼完成了我認爲它所做的事情 - 也就是隻提取出Number的數字部分,那麼32a,32fred和32c將會無序地出現,因爲字母部分沒有考慮。 –

+1

@Jeremy編碼問題的解決方案不應該包含解決方案中使用的每個函數的定義。我真的需要寫一段關於CONVERT的用途嗎? OP當然不這麼認爲,你也許是唯一一個也會期待的讀者。如果需要進一步分類,則應在問題中說明。如果我*認爲*應按照您的建議進行某種分類,那麼答案會比OP問得更多*。所以最後,我認爲這個答案能幫助OP比指向Oracle和MySQL的自然排序更有幫助嗎?是。 –

1

什麼你正在尋找被稱爲自然排序,這是從正規那種大多數系統給出不同的。我在Stack Overflow發現了一些帖子,涵蓋了各種流行的SQL引擎中的自然排序,包括關於SQL Server的一個簡要討論。

這裏的想法可能讓你開始一個解決方案。

Oracle: How can I implement a "natural" order-by in a SQL query?

您可能需要改變,雖然語法爲您的SQL引擎。

發現了另一個版本的MySQL:

Natural Sort in MySQL

找不到任何爲SQL Server呢。

EDIT3

啊,這一個涵蓋某些SQL Server的想法太:

Natural Sort in MySQL

+2

我不明白這些鏈接中的任何一個如何幫助解決問題。 –

+0

@AaronBertrand - OP需要一個自然的排序,儘管OP沒有使用這個詞我的名字。由於SQL引擎沒有內置的自然排序,因此必須使用表達式進行排序。我的鏈接涵蓋了人們以各種形式的SQL獲得自然排序的不同方式。其中一個可能已被改編。 –

+2

那麼他們並不需要它在Oracle或MySQL中,而MySQL的答案似乎也沒有任何有效的SQL Server解決方案,正如你所建議的那樣。我發現最近的是一個包含「MID」的程序,但這是一個Access函數,而不是SQL Server。 –

1

使用PATINDEX,請檢查這SQL Fiddle代碼。 @AaronBertrand剛剛回答,因爲我正在測試。

只需添加一些更多的價值和信息,請檢查this SQLServerCentral link那裏你可以找到更多的答案。

並檢查這Natural (human alpha-numeric) sort in Microsoft SQL 2005,很多有用的答案和變化。

+0

一些downvoters可以評論什麼是錯的?我只是在已經有用的答案上添加了一些更多的信息.​​.....謝謝 – Yaroslav

+2

EH,有人在這個問題上表示滿意。有+1提供文件,而不僅僅是一個神奇的咒語答案。 –

+1

我還沒有投票(但),但通常如果你想添加信息到現有的答案,你添加一個評論,而不是一個額外的答案。 –

相關問題