如何对文本型字段前面的数字部分进行排序?

神奇的章鱼哥 2008-01-07 01:29:57
有一个字段,是文本型的


12DR-TH
23*16M
2QXT
100M

如何根据前面的数字部分进行排序
100M应该在最后
按文本排的话100M在第一个了
...全文
374 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
神奇的章鱼哥 2008-01-07
  • 打赏
  • 举报
回复
现在还没用到,不过相信老乌龟的代码应该是对的
树上的鸟儿的代码暂时没研究,看结果也是对的,先结贴再说
zefuzhang2008 2008-01-07
  • 打赏
  • 举报
回复
好像没考虑运算符问题
create table tb(col varchar(20))
insert into tb values('12DR-TH')
insert into tb values('23*16M ')
insert into tb values('23*15M ')
insert into tb values('2QXT')
insert into tb values('100M')
go
这个数据怎么排序

??
chuifengde 2008-01-07
  • 打赏
  • 举报
回复
declare @a table(a varchar(20))
insert @a select '12DR-TH'
union all select '23*16M '
union all select '2QXT'
union all select '100M'

select a from @a
order by right('0000000'+left(a+'a',patindex('%[^0-9]%',a+'a')-1),7)
/*
a
--------------------
2QXT
12DR-TH
23*16M
100M

(所影响的行数为 4 行)
*/
dawugui 2008-01-07
  • 打赏
  • 举报
回复
create table tb(col varchar(20))
insert into tb values('12DR-TH')
insert into tb values('23*16M ')
insert into tb values('2QXT')
insert into tb values('100M')
go

select col from
(
select col , val = left(col , patindex('%[^0-9]%',col) - 1) from tb where patindex('%[^0-9]%',col) > 0
union all
select col , val = col from tb where patindex('%[^0-9]%',col) <= 0
) t
order by cast(val as int)

drop table tb

/*
col
--------------------
2QXT
12DR-TH
23*16M
100M

(4 行受影响)
*/
dawugui 2008-01-07
  • 打赏
  • 举报
回复
create table tb(col varchar(20))
insert into tb values('12DR-TH')
insert into tb values('23*16M ')
insert into tb values('2QXT')
insert into tb values('100M')
go

select * from tb where patindex('%[^0-9]%',col) > 0 order by cast(left(col , patindex('%[^0-9]%',col) - 1) as int)

drop table tb

/*
col
--------------------
2QXT
12DR-TH
23*16M
100M

(4 行受影响)
*/
神奇的章鱼哥 2008-01-07
  • 打赏
  • 举报
回复
楼上的兄弟,你好
这个应该不行的,因为数字位数是不定的
100M应该排在最后,因为他在这4个里最大
dawugui 2008-01-07
  • 打赏
  • 举报
回复
char2hexint不是sql server的东西.
wzy_love_sly 2008-01-07
  • 打赏
  • 举报
回复
declare @tb table (a varchar(10))
insert into @tb select '12DR-TH'
insert into @tb select '23*16M'
insert into @tb select '2QXT'
insert into @tb select '100M'

select * from @tb order by substring(a,1,1)
select * from @tb order by left(a,1)


12DR-TH
100M
23*16M
2QXT


神奇的章鱼哥 2008-01-07
  • 打赏
  • 举报
回复
有这个函数吗?
我是sql2000
jackyerror 2008-01-07
  • 打赏
  • 举报
回复
to areswang:

is the question to me?
areswang 2008-01-07
  • 打赏
  • 举报
回复
楼上05的吧?
jackyerror 2008-01-07
  • 打赏
  • 举报
回复

select * from table_1
order by char2hexint(col_1)
;


char2hexint is a teradata function. there should be a similar function in SQL server.
wzy_love_sly 2008-01-07
  • 打赏
  • 举报
回复
结果是什么

34,576

社区成员

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

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