oracle 数据拆表,Oracle对表的数据拆分和合并

在日常数据库操作中,我们经常对数据进行拆分和合并,下面让我们来看看如何实现。

假设有表TEMP_TABLE(ID,NAME,CODE),数据如下:

select t.* from temp_table t;

IDNAMECODE

1A10

2B20

3C30

4A40

5A50

6A|B|C60

我们将NAME=A的数据合并,使用Oracle函数WM_CONCAT(),SQL及结果如下:

select t.name,to_char(wm_concat(t.code))

from temp_table t

where name='A'

group by t.name;

NAMECODE

A10,40,50

因为WM_CONCAT返回结果是CLOB类型,我们可以用TO_CHAR函数转换成字符串,也可以用REPLACE函数将结果中的‘,’转变成我们需要的其他分隔符。

再来看看如何将一条记录通过指定的分隔符拆分成多条记录,用上图中的ID=6作为例子,NAME=A|B|C,我们将拆分成三条记录,SQL和结果如下:

SELECT id, REGEXP_SUBSTR(name, '[^|]+', 1, rn) b

FROM temp_table, (SELECT ROWNUM rn FROM DUAL CONNECT BY ROWNUM <= 50)

WHERE REGEXP_SUBSTR(name, '[^|]+', 1, rn) IS NOT NULL;

IDNAME

1A

2B

3C

4A

5A

6A

6B

6C

其中,REGEXP_SUBSTR就是我们要用到的拆分函数,以‘|’为分隔符拆分字段NAME,我们看到最后三行,将原本NAME=A|B|C拆分成了三条记录。需要注意的是,在FROM关键字后面(SELECT ROWNUM rn FROM DUAL CONNECT BY ROWNUM <= 50),其中50是我们预估的最大拆分数据的条数,在此例中我们使用3就够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库支持自动按日期分区,这可以通过创建分区表和使用范围分区来实现。具体步骤如下: 1. 创建分区表:首先需要创建一个表,并指定分区键和分区类型。例如,我们可以创建一个按日期分区的表: ``` CREATE TABLE my_table ( id NUMBER, created_date DATE ) PARTITION BY RANGE (created_date) ``` 2. 创建分区策略:接下来需要创建一个分区策略,用于自动创建新分区。例如,我们可以创建一个每月一个分区的策略: ``` BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE('monthly_partition', repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1'); DBMS_SCHEDULER.CREATE_PROGRAM('create_partition', program_type => 'PLSQL_BLOCK', program_action => 'BEGIN EXECUTE IMMEDIATE ''ALTER TABLE my_table ADD PARTITION my_table_p'' || TO_CHAR(SYSDATE, ''YYYY_MM'') || '' VALUES LESS THAN (TO_DATE(''''01-'''' || TO_CHAR(ADD_MONTHS(SYSDATE, 1), ''''MM'''') || ''''-01'''', ''''DD-MM-YYYY''''))''; END;'); DBMS_SCHEDULER.CREATE_JOB('create_partition_job', program_name => 'create_partition', schedule_name => 'monthly_partition', auto_drop => FALSE); END; ``` 这个策略会每月1号自动创建一个新的分区,命名为 `my_table_p_YYYY_MM`,并将 `created_date` 值小于该分区的所有记录归档到该分区中。 3. 启动任务:最后需要启动创建分区的任务,使其开始自动创建新分区。可以使用以下命令启动任务: ``` BEGIN DBMS_SCHEDULER.RUN_JOB('create_partition_job'); END; ``` 这样,Oracle数据库就会自动按日期分区了。每当新的一天或新的一月开始时,都会自动创建一个新的分区,并将相应的记录归档到该分区中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值