数据库中的“表”总的来说是无序的,也就是说,它“不应该”有“顺序”的概念。一个表里的每个条目都是一样的,本质上没有“先后”。“顺序”体现在对表的“查询”动作中。换句话说,就是你的order by才告诉引擎,查询到的若干条目应该以什么样的顺序排列。这是一个很科学也很重要的概念。因为在实际使用中,你可能今天想按某个时间字段排序,明天想按某个索引号排序,但这些所谓的“顺序”都是你想要看到的数据的一种投影方式,而并不是数据本身应当具有的属性。
如果你确实需要对数据库中的所有条目,按某个字段排列的话,比较可行的办法就是把它们都读出来,排序,清空或删除表(并重建),重新写入数据。
看到这个问题感兴趣了把 我用sqlserver2008 玩了下 源码如下:declare @tb table
(
val varchar(50)
)
insert into @tb values('106-Y00001')
insert into @tb values('106-Y00002')
insert into @tb values('106-C00001')
insert into @tb values('106-C00002')
insert into @tb values('106-1969-D002')
insert into @tb values('106-1969-D001')
insert into @tb values('106-D00001')
insert into @tb values('106-D00002')
insert into @tb values('106-1969-Y001')
insert into @tb values('106-1969-Y002')
insert into @tb values('106-1969-C001')
insert into @tb values('106-1969-C002')
insert into @tb values('106-1969-FC001')
insert into @tb values('106-1969-FY002')
insert into @tb values('106-1970-Y001')
insert into @tb values('106-1971-C001')
insert into @tb values('107-Y00001')
insert into @tb values('108-Y00001')
select *,SUBSTRING(val,1,3) a,case LEN(val) - charindex('-',reverse(val)) when 3 then '0'+ case substring(reverse(substring(reverse(val),1,charindex('-',reverse(val)) - 1)),1,1) when 'Y' then '0' when 'C' then '1' else '2' end
else '1'+ SUBSTRING(val,5,4) + case substring(reverse(substring(reverse(val),1,charindex('-',reverse(val)) - 1)),1,1) when 'Y' then '0' when 'C' then '1' when 'D' then '2' else '3'+ case substring(reverse(substring(reverse(val),1,charindex('-',reverse(val)) - 1)),2,1) when 'C' then '0' else '1' end end
end b
from @tb
order by a,b
大概看了下没问题,感觉思路对就OK了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)