listagg 反函数

drop table str;
create table str(seq number,str varchar2(100)) ;
insert into str values(1,'AA,BB,CC,DD;AA1,BB1,CC,DD1;AA2,BB2,CC,DD2;AA3,BB3,CC3,DD3;');
insert into str values(2,'AA,BB,CC1,DD;AA1,BB1,CC,DD1;AA2,BB2,CC,DD2;AA3,BB3,CC,DD3;');
insert into str values(3,'AA,BB,CC,DD;AA1,CC,BB,DD1;AA2,BB2,CC,DD2;AA3,BB3,CC3,DD3;');
COMMIT;
--1
SELECT seq,
         rtrim(regexp_substr(str || ';', '.*?' || ';', 1, LEVEL), ';') AS str
    FROM str
  CONNECT BY seq = PRIOR seq
         AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
         AND LEVEL <= regexp_count(str, ';')
--2
select distinct seq, regexp_substr(str, '[^;]+', 1, level) str
  from str
connect by level <= regexp_count(str, ';')
 order by seq

我是没看懂 有看懂的评论解释下

下面是一个mysql数据库的sql 解决以父数据为核心  连接 子数据及 爷数据 也急 上中下游数据连接

select * from (

SELECT a.aid, a.aname,  a.bid, a.bname, b.bid cid,b.banme cname,a.amount_a,a.amount_b FROM
(
SELECT
@rn:= CASE WHEN @securityid = aid THEN @rn + 1 ELSE 1 END AS rownum,
@securityid:= aid as tempId,
 a.*
FROM
(SELECT a.id aid,a.name aname,a.amount_a,a.amount_b,b.id bid,b.name bname from ent a left join ent b ON a.id = b.rel_id  	WHERE a.type = 0  AND b.type = 1 ORDER BY a.id) a
,(SELECT @rn=0, @securityid=0) b
)a
  left join
(
SELECT
@rn:= CASE WHEN @securityid = aid THEN @rn + 1 ELSE 1 END AS rownum,
@securityid:= aid as tempId,
 a.*
FROM
(SELECT a.id aid,a.name aname,b.id bid,b.name banme from ent a left join ent b ON a.id = b.rel_id 	WHERE a.type = 0 AND b.type = 2    ORDER BY a.id) a
,(SELECT @rn=0, @securityid=0) b
)b on a.aid = b.aid and a.rownum = b.rownum

union

SELECT b.aid, b.aname,  a.bid, a.bname, b.bid cid,b.banme cname,b.amount_a,b.amount_b FROM
(
SELECT
@rn:= CASE WHEN @securityid = aid THEN @rn + 1 ELSE 1 END AS rownum,
@securityid:= aid as tempId,
 a.*
FROM
(SELECT a.id aid,a.name aname,b.id bid,b.name bname from ent a left join ent b ON a.id = b.rel_id  	WHERE a.type = 0  AND b.type = 1 ORDER BY a.id) a
,(SELECT @rn=0, @securityid=0) b
)a
  right join
(
SELECT
@rn:= CASE WHEN @securityid = aid THEN @rn + 1 ELSE 1 END AS rownum,
@securityid:= aid as tempId,
 a.*
FROM
(SELECT a.id aid,a.name aname,a.amount_a,a.amount_b,b.id bid,b.name banme from ent a left join ent b ON a.id = b.rel_id 	WHERE a.type = 0 AND b.type = 2    ORDER BY a.id) a
,(SELECT @rn=0, @securityid=0) b
)b on a.aid = b.aid and a.rownum = b.rownum

) a

又是一个mysql

用于 ''1,2,3'' 字段的拆分   为   1 行  2行  3 行

SELECT
          
            t.crt_user_name,
            check_user_name,
            t.crt_time,
            t.flow_step
        FROM
            (
                SELECT  a.*,
                        substring_index( substring_index( a.repo_org, ',', b.help_topic_id + 1 ), ',',- 1 ) orgId
                FROM
                    nb_ybj_task AS a
                JOIN mysql.help_topic AS b
                ON b.help_topic_id  <(char_length( repo_org )- char_length( REPLACE ( repo_org, ',', ''))+ 1 )
                where id  = #{param1.taskId}
            ) a
        LEFT JOIN task_org t ON a.orgId = t.org_id
                                      	AND t.task_id = a.id
                                        AND t.MONTH = #{param1.month}
     
        order by  flow_step desc,crt_time desc

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Oracle数据库中没有直接的反函数来解析`LISTAGG`函数的结果。但是你可以使用其他方法来实现相似的功能。 一种常见的方法是使用正则表达式来解析`LISTAGG`函数的结果。你可以使用`REGEXP_SUBSTR`函数来匹配和提取结果中的每个元素。下面是一个示例: ``` SELECT REGEXP_SUBSTR(listagg_result, '[^,]+', 1, level) AS element FROM (SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) AS listagg_result FROM your_table) CONNECT BY LEVEL <= REGEXP_COUNT(listagg_result, ',') + 1; ``` 在这个示例中,你需要将`your_table`替换为实际的表名,`column_name`替换为实际的列名。这个查询将返回`LISTAGG`函数结果中的每个元素作为单独的行。 另一种方法是使用递归子查询来解析`LISTAGG`函数的结果。你可以使用`CONNECT BY LEVEL`子句来生成一个数字序列,并使用`SUBSTR`和`INSTR`函数来提取每个元素。下面是一个示例: ``` WITH recursive_query AS ( SELECT 1 AS level, SUBSTR(listagg_result, 1, INSTR(listagg_result, ',') - 1) AS element, SUBSTR(listagg_result, INSTR(listagg_result, ',') + 1) AS remaining FROM (SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) AS listagg_result FROM your_table) UNION ALL SELECT level + 1, SUBSTR(remaining, 1, INSTR(remaining, ',') - 1), SUBSTR(remaining, INSTR(remaining, ',') + 1) FROM recursive_query WHERE remaining IS NOT NULL ) SELECT element FROM recursive_query; ``` 同样,在这个示例中,你需要将`your_table`替换为实际的表名,`column_name`替换为实际的列名。这个查询将返回`LISTAGG`函数结果中的每个元素作为单独的行。 希望这些方法能够满足你的需求!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值