如何解决REGEXP_SUBSTR 无法仅处理当前行
(SELECT LISTAGG(EVENT_DESC,',') WITHIN GROUP (ORDER BY EVENT_DESC) FROM EVENT_REF WHERE EVENT_ID IN
( SELECT REGEXP_SUBSTR(AFTER_VALUE,'[^,]+',1,level) FROM DUAL
CONNECT BY REGEXP_SUBSTR(AFTER_VALUE,level) IS NOT NULL
)
)
我从中获取 AFTER_VALUE 的表具有以逗号分隔的整数值
AFTER_VALUE 数据 | 预期输出 |
---|---|
1 | 事件 1 |
1,2 | 事件1,事件2 |
1,12,2,5 | 事件1、事件12、事件2、事件5 |
15,13 | Event15,Event13 |
这些是 EVENT_REF 表中的 ID,有一些描述。我试图基本上呈现 前任。 1,2 作为 Event1、Event2 并从查询中发回。有多个事件,因此使用 REPLACE 会非常乏味。
当使用上述查询时,每当 AFTER_VALUE 列中有多个值时,我都会收到“ora-01722:无效数字”的错误。如果只存在一个 id ,则查询有效,但对于 1,2 或 1,13 等值,它会引发无效数字错误。
PS:事件名称不是 Event1、Event2 等,我只是提供参考。
解决方法
不需要拆分和连接子字符串,只需使用regexp_replace:
with EVENT_REF (AFTER_VALUE) as (
select '1' from dual union all
select '1,2' from dual union all
select '1,12,2,5' from dual union all
select '15,13' from dual
)
select regexp_replace(AFTER_VALUE,'(\d+)','Event\1') from EVENT_REF;
REGEXP_REPLACE(AFTER_VALUE,'(\D+)','EVENT\1')
-----------------------------------------------
Event1
Event1,Event2
Event1,Event12,Event2,Event5
Event15,Event13
,
您甚至不需要此作业的正则表达式。标准字符串函数 replace()
可以做同样的事情,而且速度更快。您只需要在字符串开头添加一个额外的 'Event'
,因为它不会“替换”任何内容。
像这样:(请注意,您不需要 with
子句;我包含它只是为了快速测试)
with
event_ref (after_value) as (
select '1' from dual union all
select '1,2' from dual union all
select '1,5' from dual union all
select '15,13' from dual
)
select after_value,'Event' || replace(after_value,',Event') as desired_output
from event_ref
;
AFTER_VALUE DESIRED_OUTPUT
----------- -----------------------------
1 Event1
1,2 Event1,Event2
1,5 Event1,Event5
15,13 Event15,Event13
,
啊,好的,看起来,您的逗号分隔列表中还有其他字符,因此您可以使用此查询:
with EVENT_REF(EVENT_ID,EVENT_DESC) as (
select 1,'Desc 1' from dual union all
select 2,'Desc 2' from dual union all
select 3,'Desc 3' from dual union all
select 4,'Desc 4' from dual union all
select 5,'Desc 5' from dual union all
select 12,'Desc12' from dual union all
select 13,'Desc13' from dual union all
select 15,'Desc15' from dual
)
select
(SELECT LISTAGG(EVENT_DESC,')
WITHIN GROUP (ORDER BY EVENT_DESC)
FROM EVENT_REF
WHERE EVENT_ID IN
( SELECT to_number(REGEXP_SUBSTR(AFTER_VALUE,'\d+',1,level))
FROM DUAL
CONNECT BY level<=REGEXP_COUNT(AFTER_VALUE,'\d+')
)
)
from (
select '1' AFTER_VALUE from dual union all
select '1,2' AFTER_VALUE from dual union all
select '1,5' AFTER_VALUE from dual union all
select '15,13' AFTER_VALUE from dual
);
附注。并且不要忘记 to_number 现在具有“默认转换错误”:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/TO_NUMBER.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。