2015-06-18 322 views
0

我有是有尺寸如下項目表:如何在sql中對字母數字數據進行排序..?

1sq.mm. 
1.5sq.mm. 
0.5sq.mm. 
2.5sq.mm. 
0.75sq.mm. 
4sq.mm. 
20mm 
25mm 
20mtr 
75mm x 50mm 
100mm x 50mm 
100mm x 100mm 
75mm x 75mm 

我想要顯示它有

0.5sq.mm. 
0.75sq.mm. 
1.5sq.mm. 
2.5sq.mm. 
4sq.mm. 
20mm 
20mtr 
25mm 
75mm x 50mm 
75mm x 75mm 
100mm x 50mm 
100mm x 100mm 

我嘗試以下SQL查詢,但我得到的錯誤

'Conversion failed when converting the varchar value '1 sq.mm.' to data type int.' 

SQL查詢:

select * from Items 
    order by CAST(SUBSTRING(Sizes, PATINDEX('%[0-9]%', Sizes), LEN(Sizes)) AS INT) 
+0

一切都在平方毫米?如果不是,你如何根據單位定義訂單? –

+1

[字母數字排序]的可能重複(http://stackoverflow.com/questions/29676432/alphanumeric-sort) –

+1

@Supreethsup:由於這些字符串是大小列的一部分,我猜他們是大小單位,意思是0.5sq.mm'可能與0.5pcs不同。將數據分解爲數字和varchar值相當容易,但根據不同的單位計算正確的順序可能有點棘手。順便說一句,你不應該保持這樣的混合數據。如果可能,將大小和單位分隔到不同的列。 –

回答

1

試試這個:

SELECT Sizes  
FROM Items 
ORDER BY CAST(LEFT(Sizes, PATINDEX('%[a-z]%', Sizes)-1) as numeric(9, 2)) 

這是假設你的數據將始終遵循由至少一個字母字符數。

sql fiddle (thanks to matt!)

+0

謝謝Zohar偷着它爲我工作 –

+0

很高興幫助,艱難的大部分工作是由馬特完成的...我已經upvoted他的答案,你應該感謝他,而不是我:-) –

4

使用REPLACEORDER BY

SELECT Sizes 
FROM Items 
ORDER BY CAST(REPLACE(Sizes,'sq.mm.','') as NUMERIC(9,2)) 

OUTPUT:

Sizes 
0.5sq.mm. 
0.75sq.mm. 
1sq.mm. 
1.5sq.mm. 
2.5sq.mm. 
4sq.mm. 

SQL小提琴:http://sqlfiddle.com/#!3/ad91f/3/0

+1

如果我沒有錯,離開sq.m(因爲它在所有條目中都是一樣的)不應該影響排序。 – apomene

+1

如果沒有'REPLACE' int他'ORDER BY'它不會以正確的順序出來 – Matt

+0

@apomene:'1sq.mm'和'1.5sq.mm'會有問題然後.'1.5sq.mm'將在'1sq.mm'之前。 – Wanderer

1
CREATE FUNCTION udf_GetNumeric 
(@strAlphaNumeric VARCHAR(256)) 
RETURNS VARCHAR(256) 
AS 
BEGIN 
DECLARE @intAlpha INT 
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
BEGIN 
WHILE @intAlpha > 0 
BEGIN 
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '') 
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
END 
END 
RETURN ISNULL(@strAlphaNumeric,0) 
END 
GO 

SELECT dbo.udf_GetNumeric('sada322sds232132132'); 

drop function udf_GetNumeric; 



Result 
322232132132 



CAST(dbo.udf_GetNumeric(Sizes) AS INT) 
+5

請不要回答與代碼只有一個問題。解釋你爲什麼這樣做,以及錯誤在哪裏。謝謝。 – FormigaNinja

0

只是一個建議 - 不是一個答案:

我會重新考慮設計表格 - 如果可能的話。 目前,您正在對具有兩種不同類型信息的列進行排序:長度(毫米)和麪積(平方毫米),這是毫無意義的。

也許你寧願有一個數據結構是這樣的:

CREATE TABLE MyTable(
    length decimal(5,2), 
    width decimal(5,2), 
    area decimal(10,2), 
    unit varchar(10) 
) 

不用說,這樣的設計將是非常簡單的排序。

相關問題