实现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