1

这是关于 Oracle 11g 数据库的问题。

我正在尝试查询 Atlassian Confluence 日历表。它将整个日历的日历条目存储到单行中的单个值中,这是 iCal 废话的巨大球团。

如果每个条目中的字段顺序一致,那么我的正则表达式 fu 将足够强大,可以解析出我正在搜索的特定条目......但由于我需要搜索日期、描述和摘要,所有其中显然可以在 BEGIN/END VEVENT 中以任何顺序排列,这是不可能的。我有一半的把握,即使向前和向后看也是不可能的。

是否有一个 sql(不是 pl-sql)结构可以将这个单个字符串/blob 值分成多行,以便我可以执行以下操作:

select * from (chopped up value) where x like '%something%';

这将使它与 wm_concat() 或 group_concat 有点相反...

一个典型的条目看起来像这样(它已经有 50 或 60 个):

BEGIN:VEVENT
UID:20130724T153322Z--922125579@atlassianzzz.zzz.edu
SUMMARY:Richard Smichard
ATTENDEE;X-CONFLUENCE-USER=rismich:https://atlassianzzz.zzz.edu/c
 onfluence/display/~rismich
LOCATION:
DESCRIPTION:Primary
DTSTART;VALUE=DATE:20130726
DTEND;VALUE=DATE:20130729
DTSTAMP:20130724T153322Z
CREATED:20130724T153322Z
LAST-MODIFIED:20130724T153322Z
ORGANIZER;X-CONFLUENCE-USER=botard:MAILTO:botard@zzz.edu
SEQUENCE:0
END:VEVENT

我无法使用 PL-SQL 或构建适当的解析器,因为它将运行的环境无法做到这一点。我开始运行一个 select 语句,它要么返回我正在寻找的值,要么不返回。

此外,NoSQL 很烂。重要时刻。

4

1 回答 1

1

这是一个快速测试:

with w1 as
(
  select 'BEGIN:VEVENT\
UID:20130724T153322Z--922125579@atlassianzzz.zzz.edu
SUMMARY:Richard Smichard
ATTENDEE;X-CONFLUENCE-USER=rismich:https://atlassianzzz.zzz.edu/c
 onfluence/display/~rismich
LOCATION:
DESCRIPTION:Primary
DTSTART;VALUE=DATE:20130726
DTEND;VALUE=DATE:20130729
DTSTAMP:20130724T153322Z
CREATED:20130724T153322Z
LAST-MODIFIED:20130724T153322Z
ORGANIZER;X-CONFLUENCE-USER=botard:MAILTO:botard@zzz.edu
SEQUENCE:0
END:VEVENT' text from dual
),
w2 as
(
  select 'SUMMARY' label from dual
  union all
  select 'DESCRIPTION' label from dual
)
select regexp_substr(w1.text, 'UID.*') id, w2.label,
       substr(regexp_substr(w1.text, w2.label || '.*'),
              instr(regexp_substr(w1.text, w2.label || '.*'), ':') + 1) spl
from w1, w2;

它给:

1   UID:20130724T153322Z--922125579@atlassianzzz.zzz.edu    SUMMARY Richard Smichard
2   UID:20130724T153322Z--922125579@atlassianzzz.zzz.edu    DESCRIPTION Primary
于 2013-07-26T17:03:23.790 回答