我想对一个varchar类型字段的尾数进行range分区,
比如此字段分别为:
'123'
'456'
'789'
则我想分别将尾数'3', '4', '9'分到第3,4,9号分表中.
在不改变现有表结构的前题下,似乎做不到啊?请高手指点一下.

解决方案 »

  1.   


    -- 如果你现在用的是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分区,这样还可以防止非法数据的插入!