循环遍历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脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

字段是多个值拼接的,怎么一一取出来

Oracle For 循环,字符串拼接,查找

删除带有特殊字符的单词

如何在 oracle 9i 中最好地拆分 csv 字符串