循环遍历Oracle中拆分的字符串
Posted
技术标签:
【中文标题】循环遍历Oracle中拆分的字符串【英文标题】:Looping through string splitted in Oracle 【发布时间】:2021-05-17 12:50:33 【问题描述】:我有一个查询,它以字符串格式从列 [datatype varchar2] 返回数据。
select AuditEvents.BeforeValue from AuditEvents where condition......
现在,AuditEvents.BeforeValue 具有混合类型的数据,例如 null 或“1,2,3,4,5”或“2,3,1,4”或“3,14”或“11:10”或“安全”——不带引号。这些 "1,2,3,4,5" 是另一个表 'EventDesc' 中的 eventId。
AuditEvents.BeforeValue 列数据依赖于另一列 AuditEvents.EventyType,它是 varchar。在 EventyType 列中,如果数据为“ExcludedEvents”,则 BeforeValue 应从另一个具有 eventId 描述的 EventDesc 表中获取数据。像 1=Event1 2=Event2 等等。所以在“1,2,3”的情况下,它应该以“Event1,Event2,Event3”的形式获取数据
我的查询是可以直接在 oracle 查询中而不是在 c# 端获取基于上述场景的数据(因为当 Ui 要求搜索或排序时我遇到了很多麻烦)
【问题讨论】:
【参考方案1】:有可能吗?是的,有一些麻烦,因为并非所有值都存在于您的 events
表中,也不是所有值都有效。
看这个例子,在代码中读取 cmets。
SQL> with
2 -- sample data
3 events (id, name) as
4 (select 1, 'Event 1' from dual union all
5 select 2, 'Event 2' from dual union all
6 select 3, 'Event 3' from dual
7 ),
8 auditevents (beforevalue) as
9 (select '2,3,1' from dual union all
10 select 'security' from dual union all
11 select '11:10' from dual
12 ),
13 -- query you might need begins here
14 -- split AUDITEVENTS to rows
15 ae_split as
16 (select beforevalue,
17 regexp_substr(beforevalue, '[^,]+', 1, column_value) id
18 from auditevents cross join
19 table(cast(multiset(select level from dual
20 connect by level <= regexp_count(beforevalue, ',') + 1
21 ) as sys.odcinumberlist))
22 )
23 -- join split AUDITEVENTS with the EVENTS table
24 select s.beforevalue, listagg(e.name, ', ') within group (order by e.id) events
25 from ae_split s join events e on to_char(e.id) = s.id
26 where exists (select null from events a where to_char(a.id) = s.id)
27 group by s.beforevalue;
BEFOREVALUE EVENTS
----------- ------------------------------
2,3,1 Event 1, Event 2, Event 3
SQL>
【讨论】:
但我想要的是 2,3,1 的输出不应该是 3 行,而是单行字符串逗号分隔,即 2,3,1 应该导致单行为 Event2,Event3,Event1 我编辑了答案;基本上,它就是您要使用的 LISTAGG。以上是关于循环遍历Oracle中拆分的字符串的主要内容,如果未能解决你的问题,请参考以下文章
linux shell脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]