求大神帮忙看看一个大数据排序的问题!!!

heochuan 2017-05-15 02:45:34
我现在是想解决sqlserver2005字符排序的问题,“编号”列是字符类型,变准的话就是数字,按照数字类型排序,问题是有的时候还会出现-或者.的字符,所以不能把类型改成int,那样也就不会出现今天这个问题。
如果单纯的order by排序,下面是sql语句,索引和分页都有。
select * from (select top 200 row_number() over(order by "编号") as rowid,* from TEST) as t where rowid > 100
100~200百万的数据都挺快的。
但这样排序不是正确的,它是会1、10、11、2、3、。。。这样排,因为是字符型,
所以我用了函数order by right(REPLICATE('0',10) + cast("编号" AS varchar(10)),10) 这样排序,结果是正确了。
可是数据量大起来速度就不行了,
有没有大神能帮我解决一下这个问题,我相信肯定会有遇到过类似的问题吧,你们都是怎么解决的?
有什么更好的方案呢?
...全文
197 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2017-05-17
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('test') IS NOT NULL
DROP TABLE test
CREATE TABLE test( bianHao VARCHAR(8))
INSERT INTO test(bianHao)VALUES('1-'),('2-'),('3.'),('.4'),('5')
--添加计算列
ALTER TABLE test ADD newNO AS REPLACE(REPLACE(REPLACE(bianHao,'-',''),'_',''),'.','') Persisted
--添加计算列的索引
CREATE INDEX ix_test_newNo ON test(newNO)
--实际分页
;WITH cte AS (
SELECT ROW_NUMBER() OVER ( ORDER BY newNO ASC) AS rid,* FROM test
)
SELECT * FROM cte WHERE rid BETWEEN 3 AND 4
/*
rid	bianHao	newNO
3	3.	    3
4	.4	    4
*/
五维思考 2017-05-15
  • 打赏
  • 举报
回复
如果“编号”字段不能改,那么最好增加一列,把它变为“编号”的格式化或数字化,然后按照这一列进行排序
二月十六 版主 2017-05-15
  • 打赏
  • 举报
回复
"编号"必须有-或者.之类的吗?如果不需要,直接update掉,然后转换成int类型
卖水果的net 版主 2017-05-15
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
大师好久不见。
卖水果的net 版主 2017-05-15
  • 打赏
  • 举报
回复
转成纯数字的吧,这个速度快。 字符型在计算上,比较数字型要差好几个级别;
Tiger_Zhao 2017-05-15
  • 打赏
  • 举报
回复
设计的问题啊。
编号如果是数字,就不允许有非法字符——更正后用int型字段。
编号如果是字符,考虑排序就要规定填满10字符——全部补0

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧