类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
表a: 字段名:busid;
数据如下:
1
2
3
4
5
11
12
13
22
31
k50
k53
如果我用select * from a order by id 结果如下:
1
11
12
13
2
22
31
k50
k53
如果我想实现查询结果如下:
1
2
3
4
5
11
12
13
22
31
k50
k53
请问查询语句该如何写?
网友回答:
字段类型改用number,不要有非数字的内容.
带order by的子句不能union比较郁闷,如果可以的话可以这样实现
select busid from t_a where substr(busid,1,1)>9 or substr(busid,1,1)<0 order by busid
select busid from t_a where substr(busid,1,1)>=0 and substr(busid,1,1)<=9 order by to_number(busid);
你的字母如果有规则就可以解决,如:首为字母K,可以用如下方法解决:
select decode(substr(no1,1,4),9999,k||substr(no1,5),no1) as no from
(
select decode(substr(no,1,1),k,9999||substr(no,2),no) no1 from testa order by to_number(no1)
);
SQL> select no from testa;
NO
---
111
101
102
103
104
105
107
108
109
110
11
12
13
14
15
16
1
2
3
4
NO
---
k5
k7
k8
k9
24 rows selected
SQL>
SQL> select decode(substr(no1,1,4),9999,k||substr(no1,5),no1) as no from
2 (
3 select decode(substr(no,1,1),k,9999||substr(no,2),no) no1 from testa order by to_number(no1) asc
4 );
NO
---
1
2
3
4
11
12
13
14
15
16
101
102
103
104
105
107
108
109
110
111
NO
---
k5
k7
k8
k9
24 rows selected
创建一个临时表,先插入数字型的行,并排好序,再插入带字母的行,也排好序,整个表用一个字段来索引所有数据行此,然后查询结果
select to_number(id) idd from a
where trim(translate(id,1234567890, )) is null
order by idd
如果只有字母k出现的话
select to_number((replace(cusidt,k,))) as bb from tr01 order by bb
如果只有字母k出现的话
select busid from a order by to_number((replace(cusid,k,)))
order by lpad(busid,10);
10 为你的数据栏位字段长度
你可以考虑把编码的长度统一定为3位,不足3位的编码前面补0。
我认为可以补充0 生成新的字段 用这个新的字段来排序
oracle是允许这样做的哦
select emp2.*,lpad(备注,9,0) sortid from emp2 order by sortid;
姓名 备注 编码 职业 SORTID
------------ ------------ ------------ ------------ --------------
yeqiufeng 1 3 作家 000000001
秋枫软件 2 4 000000002
秋枫苦雪 100 1 程序员 000000100
叶秋枫 200 2 厨师 000000200
天玄软件 系统填写 5 软件公司 0系统填写
ddy 系统填写 6 manager 0系统填写
这是我的测试结果 还行吧
yeqiufeng(叶秋枫) 兄的建议最好。其实就是个右对齐再排序的问题。