小弟实在搞不定了……紧急求助SQL语言达人……流泪

舟_雨 2010-09-14 10:04:50
有一个表TB_STDITAL
里面有一列SITEM, varchar类型。
存的东西为条款,数据为:
1.1
1.1.2
1.1.3
1.2
1.2.1
1.3
现在有些条款前带字母,
C.1.2.2
需求:字母C和点. 不参与排序,要求C.1.2.2排在1.3前,而且要排在1.2.1后。而且这个C.两个字符还必须显示在条款上。



急啊,流泪求助!!!
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2010-09-14
  • 打赏
  • 举报
回复
倒,你改一下不就可以了.
order by case when substr(SITEM,1,1) ='C' then substr(SITEM,3)else SITEM end
舟_雨 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 minitoy 的回复:]
order by case when substr(SITEM,1,1) between '0' and '9' then SITEM else substr(SITEM,3) end
[/Quote]

恩,这样是直接把前面两个字符截掉再排序。

我现在不能简单地截掉两个字符呀,因为是要判断这个字母是不是C,如果是C. 就要截掉,如果是别的,就不管的。所以这个需求很疼……这该怎么写呢?
Dream_1986 2010-09-14
  • 打赏
  • 举报
回复
看样子我理解错了
Dream_1986 2010-09-14
  • 打赏
  • 举报
回复

create table tb_stdital
(sitem varchar(10));

insert into tb_stdital values('C.1.1');
insert into tb_stdital values('C.1.2');
insert into tb_stdital values('C.1.3');
insert into tb_stdital values('C.1.2');
insert into tb_stdital values('C.1.2.1');
insert into tb_stdital values('C.1.2.2');
insert into tb_stdital values('C.1.2.1');
insert into tb_stdital values('C.1.3');
insert into tb_stdital values('C.1.3.1');

SELECT * FROM tb_stdital ORDER BY sitem ASC;
--查询结果
SITEM
C.1.1
C.1.2
C.1.2
C.1.2.1
C.1.2.1
C.1.2.2
C.1.3
C.1.3
C.1.3.1
ngx20080110 2010-09-14
  • 打赏
  • 举报
回复
10g或以上版本可以用正則表達式

with tmp as
(
select '1.1' chp from dual union all
select '1.1.2' chp from dual union all
select '1.1.3' chp from dual union all
select '1.2' chp from dual union all
select '1.2.1' chp from dual union all
select '1.3' chp from dual union all
select 'C.1.2.2' chp from dual
)
select chp,regexp_substr(chp, '([0-9]+\.?)+')
from tmp
order by regexp_substr(chp, '([0-9]+\.?)+');

CHP REGEXP_SUBSTR(CHP,'([0-9]+\.?)+')
---------- ---------------------------------
1.1 1.1
1.1.2 1.1.2
1.1.3 1.1.3
1.2 1.2
1.2.1 1.2.1
C.1.2.2 1.2.2
1.3 1.3
minitoy 2010-09-14
  • 打赏
  • 举报
回复
order by case when substr(SITEM,1,1) between '0' and '9' then SITEM else substr(SITEM,3) end
minitoy 2010-09-14
  • 打赏
  • 举报
回复
这样简单些
case when substr(SITEM,1,1) between '0' and '9' then SITEM else substr(SITEM,3) end
舟_雨 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 minitoy 的回复:]
只是前面带一个字母和.号么?
[/Quote]

是的,前面只带个字母和一个点
minitoy 2010-09-14
  • 打赏
  • 举报
回复
order by decode( substr(translate(SITEM,'1234567890.'||SITEM,'1234567890.'),1,1),'.',substr(translate(SITEM,'1234567890.'||SITEM,'1234567890.'),2),SITEM)
Dream_1986 2010-09-14
  • 打赏
  • 举报
回复
占个位,试试
minitoy 2010-09-14
  • 打赏
  • 举报
回复
只是前面带一个字母和.号么?
gelyon 2010-09-14
  • 打赏
  • 举报
回复
这个最直接:
order by case when substr(SITEM,1,1) ='C' then substr(SITEM,3)else SITEM end
cjh200102 2010-09-14
  • 打赏
  • 举报
回复
路过。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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