再次请教SQL order by 字符排序

Alex99cn 2008-03-19 04:51:26
有一个数据表,其中一列为VChar,存储这样的数据
1
1-1
1-2
1-10
1-11
2
2-1
2-2
2-10
2-11
10
10-1
10-2
10-10
10-11
11
11-1
11-2
11-10
11-12

默认显示按字符顺序显示
即:
1
10
10-1
10-10
10-11
10-12
10-2
11
1
1-1
1-10
1-11
11-1
11-10
11-12
11-2
........

如何才能有序显示,即:
1
1-1
1-2
1-10
1-11
2
2-1
2-2
2-10
2-11
10
10-1
10-2
10-10
10-11
11
11-1
11-2
11-10
11-12
非常谢谢!
...全文
348 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alex99cn 2008-03-20
  • 打赏
  • 举报
回复
帮帮忙!急!
tcxx2008 2008-03-20
  • 打赏
  • 举报
回复
非常的难,我不懂,只能支持下
Alex99cn 2008-03-20
  • 打赏
  • 举报
回复
有些复杂
我想增加一列,填充为101,102,110,111,...,即取“-”左右两位,不满两位用0补,如何一次性更新?
谢谢:)
liangCK 2008-03-19
  • 打赏
  • 举报
回复
3楼.
Alex99cn 2008-03-19
  • 打赏
  • 举报
回复
谢谢你们的回复!
select *
from t
order by cast(PARSENAME(replace(col,'-','.'), 2) as int),
cast(PARSENAME(replace(col,'-','.'), 1) as int)
显示为:
1
2
10
11
1-1
1-2
1-10
1-11
2-1
2-2
2-10
2-11
10-1
10-2
10-10
10-11
11-1
11-2
11-10
11-12
还有其它方法能正常显示所说的结果否?
非常谢谢,增加一列?
-狙击手- 2008-03-19
  • 打赏
  • 举报
回复
反了


select *
from t
order by cast(PARSENAME(replace(col,'-','.'), 2) as int),
cast(PARSENAME(replace(col,'-','.'), 1) as int)
liangCK 2008-03-19
  • 打赏
  • 举报
回复
把上面函数中的"."改为"-"即可
liangCK 2008-03-19
  • 打赏
  • 举报
回复
CREATE TABLE tb (ID INT IDENTITY(1,1),Code VARCHAR(20))
GO
INSERT tb SELECT '1'
UNION ALL SELECT '2'
UNION ALL SELECT '3'
UNION ALL SELECT '1.1'
UNION ALL SELECT '2.1'
UNION ALL SELECT '131.2.1.11.1.131111'
UNION ALL SELECT '2.2'
UNION ALL SELECT '121.2.1.1.1.131111'
UNION ALL SELECT '3.1'
UNION ALL SELECT '3.2'
UNION ALL SELECT '20.1'
UNION ALL SELECT '1.1.1'
UNION ALL SELECT '1.1.2'
UNION ALL SELECT '1.1.3'
UNION ALL SELECT '1.1.11.1'
UNION ALL SELECT '1.1.2.1'
UNION ALL SELECT '2.1.2.1'
GO
CREATE FUNCTION dbo.ReplaceCode(@code VARCHAR(20))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @re VARCHAR(8000),@tempStr VARCHAR(100)
SELECT @re='',@tempStr=''

WHILE CHARINDEX('.',@code)>0
BEGIN
SELECT @tempStr=LEFT(@code,CHARINDEX('.',@code)-1),
@re=@re+RIGHT('0000000000'+@tempStr,10),
@code=STUFF(@code,1,CHARINDEX('.',@code),'')
END
IF LEN(@code)>0
SET @re=@re+RIGHT('0000000000'+@code,10)
RETURN @re
END
GO
SELECT *
FROM tb
ORDER BY dbo.ReplaceCode(code)
DROP TABLE tb
DROP FUNCTION ReplaceCode
-狙击手- 2008-03-19
  • 打赏
  • 举报
回复
最多就一个'-'吗


select *
from t
order by cast(PARSENAME(replace(col,'-','.'), 1) as int),
cast(PARSENAME(replace(col,'-','.'), 2) as int)
-狙击手- 2008-03-19
  • 打赏
  • 举报
回复
上次有人问过,

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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