• 主页
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流

如何对一个字符串尾数进行range分区?

wangyangcheng 2013-03-19 07:34:13
我想对一个varchar类型字段的尾数进行range分区,
比如此字段分别为:
'123'
'456'
'789'
则我想分别将尾数'3', '4', '9'分到第3,4,9号分表中.


在不改变现有表结构的前题下,似乎做不到啊?

请高手指点一下.
...全文
121 点赞 收藏 3
写回复
3 条回复
elhao2011 2013年03月20日
'3', '4', '9'?????什么规律???,没看懂
回复 点赞
music_mouse 2013年03月20日
可尝试一下,新增个字段。
回复 点赞
luoyoumou 2013年03月20日

-- 如果你现在用的是Oracle 11g 的话,可以基于这个“varchar类型字段”创建一个虚拟字段,例如:
CREATE TABLE tt(
  c1 varchar2(30),
  c2 GENERATED ALWAYS AS (substr(c1,-1,1)) VIRTUAL VISIBLE
)
PARTITION BY RANGE (c2)
(partition pre_p0 values less than('0') tablespace part01,
 partition p0 values less than('1') tablespace part02,
 partition p1 values less than('2') tablespace part03,
 partition p2 values less than('3') tablespace part04,
 partition p3 values less than('4') tablespace part01,
 partition p4 values less than('5') tablespace part02,
 partition p5 values less than('6') tablespace part03,
 partition p6 values less than('7') tablespace part04,
 partition p7 values less than('8') tablespace part01,
 partition p8 values less than('9') tablespace part02,
 partition p9 values less than(maxvalue) tablespace part03
);

-- 如上所示,可以将每个分区指定不同的表空间。

insert into tt(c1) values('lym123');
insert into tt(c1) values('lym2013');
insert into tt(c1) values('lym2014');
insert into tt(c1) values('lym520');
insert into tt(c1) values('lym456');
insert into tt(c1) values('lym789');
insert into tt(c1) values('lym_tudou');
insert into tt(c1) values('lym_youku');
commit;

-- 查看每个分区中有哪些数据:
select * from tt partition(p0);
select * from tt partition(pre_p0);
select * from tt partition(p9);

-- 最后一个字符串的ASCII码小于“0的ASCII码”的数据将放到 pre_p0 子分区
-- 最后一个字符串的ASCII码大于等于“9的ASCII码”的数据将放到 p9 子分区

-- 其实,如果你的这个字符的末位永远是数字的话,建议用list分区,这样还可以防止非法数据的插入!
回复 点赞
发动态
发帖子
Oracle
创建于2007-09-28

6410

社区成员

5.4w+

社区内容

Oracle开发相关技术讨论
社区公告
暂无公告