2013-12-15 80 views
1

我在下面的鏈接描述了同樣的問題:在MSSQL中對包含數字的字符串列進行排序?

Sorting string column containing numbers in SQL?

我有一個包含了兩個在開始和在列的末尾空格的數字數據字符串列,我需要對它進行排序。

我發現(在MySQL)的解決方案是:

SELECT * 
    FROM data 
ORDER BY left(st,LOCATE(st,' ')), 
      CAST(SUBSTRING(st,LOCATE(st, ' ')+1) AS SIGNED) 

我的問題是,如果這個解決方案是最佳的,如果我把它轉換到MSSQL不會造成很大的負擔,並在表上有更多運行超過100.000條記錄。

另外請建議我轉換到Mssql,因爲我不是很熟悉mssql。

感謝

+0

MSSQL或MySQL?這是什麼? –

+0

我想在Mssql中,但我不知道,我在Mysql中測試。但我不確定這是否是最佳解決方案,以及如何將其轉換爲mssql。 –

+0

你可以顯示你的專欄中的一些樣本值嗎? – peterm

回答

1

上述MySQL查詢的SQL Server版本可能看起來像

SELECT * 
    FROM table1 
ORDER BY LEFT(name, CHARINDEX(' ', name)), 
      CAST(RIGHT(name, LEN(name) - CHARINDEX(' ', name) + 1) AS INT) 

這裏是SQLFiddle演示

我們從來沒有見過你的樣本數據,但如果你只是有數字值與該列中的前導和/或尾隨空格,您可以執行

SELECT * 
    FROM table1 
ORDER BY CAST(name AS INT) 

這裏是SQLFiddle演示

+0

非常感謝。你怎麼看。這種排序是否會造成很大的負載,應該避免在大型數據庫上使用它,或者可以使用它。我寧願不對該列進行排序,而不是進行數據庫壓縮。 –

+0

表現明智,這是一場噩夢。您應始終在執行計劃中進行顯式排序操作,以便處理結果集中的所有行。 – peterm

+0

好的。我會放棄這種。謝謝 –

0

你可能有一些性能問題,在某種意義上說ORDER BY子句不會拿你可能已經上定義的索引的優勢。

我的建議是在2列拆分列和改變ORDER BY子句到一個簡單的一個:

ORDER BY Name1, Name2 

爲了讓您的應用程序代碼保持不變,你可以添加一個computed column

ALTER TABLE <tablename> ADD Name AS Name1 + ' ' + Name2 
+0

我無法分割列...我與其他應用程序共享該Db。其實我沒有訪問該數據庫。我只是在應用程序(網站)中調用存儲過程。我只嘗試找到該過程的解決方案...下面的示例用TRIM和字符串排序值的情況如何?對我來說,如果我按字符串排序,但我確信這會造成巨大的負擔,對我來說更好。也許更多.. –

+0

@MihaiStancioiu:在您的情況下,peterm提供的解決方案可能是單一解決方案。將來,您可能希望將這些值存儲在單獨的列中。關於TRIM專欄,我會在那裏發表評論。 –

0

你可以簡單的使用RTRIMLTRIM

SELECT * 
FROM data 
ORDER BY RTRIM(LTRIM(st)) 

另一種解決方法是將REPLACE在您的專欄這樣所有空格:

SELECT * 
FROM data 
ORDER BY REPLACE(st,CHAR(32),'') 
+0

@MihaiStancioiu:排序爲字符串與int之間有區別。例如,將'1','2','13'排序爲int將返回:'a 1','a 2','a 13',但按字符串排序將返回:'a 1 ','13','2'。 –

+0

是的,我知道這是有區別的。我實際上需要將它們排序爲字符串(以下鏈接中的第二個版本),但我認爲使用int會使查詢速度更快...因此,修剪列並將其排序爲字符串可以嗎? http://sqlfiddle.com/#!3/ce7c2/1 –

+0

@MihaiStancioiu,如果您需要將列作爲字符串排序,則可以使用修剪功能或替換功能。如果需要,您可以自由地將這兩種技術的結果作爲「INT」。我可以肯定,但相信使用'CHARINDEX','LEFT'和'RIGHT'函數會更快,但它可以用來檢查執行計劃並做出決定。 – gotqn

相關問題