2015-06-18 278 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) 
) 

不用说,这样的设计将是非常简单的排序。

相关问题