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

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


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

请高手指点一下.
...全文
325 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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分区,这样还可以防止非法数据的插入!

17,140

社区成员

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

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