相关文章推荐

实现sql:

SELECT T1.*, T2.COLUMN_VALUE AS DS_ID
FROM AS_SMS_REMIND_ITEM T1, table(split(T1.range, ',')) T2
where ID=478

实现效果:

DS_ID字段是由RANGE字段的值拆分并行转列后的结果。

split是自定义的一个function,内容如下:

create or replace function split (p_list clob, p_sep varchar2 := ',')
  return tabletype
  pipelined
  l_idx    pls_integer;
  v_list  varchar2 (32676) := to_char(p_list);
begin
      l_idx  := instr (v_list, p_sep);
      if l_idx > 0
        pipe row (substr (v_list, 1, l_idx - 1));
        v_list  := substr (v_list, l_idx + length (p_sep));
        pipe row (v_list);
        exit;
      end if;
  end loop;

函数split中return的返回值类型为tabletype,tabletype是一个自定义的类型。创建的脚本如下:

create or replace type tabletype as table of varchar2(32676);
查询sql:select * from AS_SMS_REMIND_ITEM where ID =478查询结果:将表中RANGE字段按照逗号拆分并转成列显示实现sql:SELECT T1.*, T2.COLUMN_VALUE AS DS_IDFROM AS_SMS_REMIND_ITEM T1, table(split(T1.range, ',')) T... select regexp_substr('444.555.666', '[^.]+', 1, level) col from dual connect by level <= regexp_count('444.555.666', '\.') + 1 输出结果: 多行拆分 如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法:
Oracle一列的多行数据拼成一行显示字符 Oracle一列的多行数据拼成一行显示字符的方法一共有两种,如下: 1.oracle提供的函数WMSYS.WM_CONCAT,格式WMSYS.WM_CONCAT(A)。默认’,‘隔开,可以使用replace修改。 该函数是去重之后,才拼成一行的。 SELECT replace(WMSYS.WM_CONCAT(a.PHONE),’,’,’;’) from PHONE a; 2.oracle提供的函数ListAgg,语法格式: LISTAGG( [,]) WI
记录一个在oracle多行多列的函数,有一个项目近期到了收尾阶段,忽然客户说有一个成本分摊的统计表逻辑要调整,我一看需求瞬间头大了,其中比较麻烦的一段逻辑就是需要把单行的多列数据分割成多行,百度了一下方法,大概是这样的。 原数据结构如下:每个人会有多个成本分摊,最后需要汇总出每个成本中心的分摊金额 首先需要先把这每行数据分割一下,分割成一个成本分摊对应一行数据 sql脚本如下: select max(decode(item, '物联网卡数', value, '')) as gvalue, max(decode(item, '总数', value, '')) as zsvalue from (select item, value from jzsh_lsd_opti_4feature
 
推荐文章