2015-02-05 65 views
3

我有这样的数据:如何通过多部分X.Y [.Z]“版本”数字订购查询结果?

nov_id 
2.1.1 
2.1.10 
2.1.11 
2.1.12 
2.1.13 
2.1.14 
2.1.2 
2.1.3 
2.1.4 
2.1.5 
2.1.6 
2.1.7 
2.1.8 
2.1.9 
2.2 
2.3 
2.4 
2.5 
2.6 

我需要订购我的结果,所以我的结果预计是这样的:

nov_id 
2.1.1 
2.1.2 
2.1.3 
2.1.4 
2.1.5 
2.1.6 
2.1.7 
2.1.8 
2.1.9 
2.1.10 
2.1.11 
2.1.12 
2.1.13 
2.1.14 
2.2 
2.3 
2.4 
2.5 
2.6 

这是我的尝试之一:

Select nov_id 
From dbo.NS_tbl_sc_novedad 
Order by Convert(int,Left(Ltrim(Rtrim(replace(nov_id,'.','')))+'0000',4)); 

我试着粘贴一些零和顺序,但很明显,我还没有得到它。

+0

您的值2.1.1不是数字,因此无法转换为浮点数以便对列进行排序。 – 2015-02-05 15:47:25

+0

你的专栏的类型是什么? – 2015-02-05 15:48:29

+0

的数据类型是nvarchar – MelgoV 2015-02-05 15:49:24

回答

1

这应该与具有2或3的任意字符串工作具有任意数量的数字的零件,例如1546.345.245和999.34

select 
    nov_id 
from data 
cross apply (
    select charindex('.', nov_id) as pos 
) as c1 
cross apply (
    select charindex('.', nov_id, c1.pos+1) as pos 
) as c2 
order by 
    convert(int, left(nov_id, c1.pos-1)), 
    convert(int, substring(nov_id, c1.pos+1, isnull(nullif(c2.pos, 0), 100)-c1.pos-1)), 
    convert(int, case c2.pos when 0 then 0 else substring(nov_id, c2.pos+1, 100) end) 

看起来很小我SSY,虽然:)

2

为您的特定数据,这将工作:

order by left(mov_id, 3), 
     len(mov_id), 
     mov_id 

的想法是由长度订购,因为在最后的小数字有一个更短的长度 - 定值的方式存储。

这可以修改为更一般化,具体取决于数据的真实外观。

+0

它不适用于中间值,是不是? – 2015-02-05 15:48:53

+2

当第一部分变为两位数(例如10.1.1)时,它也不起作用 – 2015-02-05 15:50:08

+1

这明确对样本数据起作用。这并没有被宣传为适用于每种可能的数据组合。 – 2015-02-05 16:04:28

0

这是我(可能在设计的解决方案)...但它的工作原理

declare @temp table (value varchar(20),orderby int) 

insert into @temp (value) 
Values('2.1.1'), 
('2.1.10'), 
('2.1.11'), 
('2.1.12'), 
('2.1.13'), 
('2.1.14'), 
('2.1.2'), 
('2.1.3'), 
('2.1.4'), 
('2.1.5'), 
('2.1.6'), 
('2.1.7'), 
('2.1.8'), 
('2.1.9'), 
('2.2'), 
('2.3'), 
('2.4'), 
('2.5'), 
('2.6') 

UPdate @temp set orderby= case when len(replace(value,'.',''))=2 then replace(value,'.','')*100 
           when len(replace(value,'.',''))=3 then replace(value,'.','')*10 
           else replace(value,'.','') end 
SELECT value FROM @temp 
order by orderby ASC 

上面给出结果集

2.1.1 
2.1.10 
2.1.11 
2.1.12 
2.1.13 
2.1.14 
2.1.2 
2.1.3 
2.1.4 
2.1.5 
2.1.6 
2.1.7 
2.1.8 
2.1.9 
2.2 
2.3 
2.4 
2.5 
2.6 
+0

请注意,您可以在插入中排除orderby。 – ricky89 2015-02-05 15:51:52

2

如何:从内森贝德福德的 '劫持' 的PARSENAME功能How do I split a string so I can access item x?

SELECT nov_id 
FROM @example 
ORDER BY 
    CASE WHEN PARSENAME(nov_id, 3) IS NULL THEN 
    CAST(PARSENAME(nov_id, 2) AS INTEGER)*10000 
    +CAST(PARSENAME(nov_id, 1) AS INTEGER)*100 
    ELSE 
    CAST(PARSENAME(nov_id, 3) AS INTEGER)*10000 
    +CAST(PARSENAME(nov_id, 2) AS INTEGER)*100 
    +CAST(PARSENAME(nov_id, 1) AS INTEGER) 
    END 

借用它会换号工作到99.99.99。为了支持更多数字,您需要增加CASE语句中的倍数。

+0

请尝试增加到4个点:)类似于1.20.3.2.1 – 2015-02-05 16:18:00

+0

这种技术不会那样做! – Elliveny 2015-02-05 16:20:55