Oracle SQL:取一个字符串并变成一个逻辑表?

问题描述 投票:0回答:1

我在使用包含注释的字符串(varchar(4000))的列值时正在寻找一些建议。我必须基于日期执行提取,但是除了字符串中的时间戳,我没有其他时间戳。我需要提取过去6个月内创建的所有评论。我一直在玩regexp_SUBSTR,regexp_INSTR,但是由于10g的限制,我无法使用regexp_count,这使生活变得很困难。

字符串看起来像这样;

LOCKED ENTITY: ACCOUNT
LOCKED BY USER: ops
LOCKED AT: 31/05/2004 11:47
CUST NOTES: <Please enter explanation here>
Customer notes are entered here.

UNLOCKED ENTITY: ACCOUNT
UNLOCKED BY USER: ops
UNLOCKED AT: 31/05/2004 11:49
UNLOCK NOTES: <Please enter explanation here>
Test

LOCKED ENTITY: USER
LOCKED BY USER: ops
LOCKED AT: 31/05/2004 11:50
LOCK NOTES: <Please enter explanation here>
Test

UNLOCKED ENTITY: USER
UNLOCKED BY USER: ops
UNLOCKED AT: 24/08/2009 16:47
UNLOCKED NOTES: <Please enter explanation here>

谢谢您标记了这些数据块,但是我需要单独提取上面的所有“块”,因此基本上具有一个ID和4条记录。 ID是此表的另一列。

我的问题是,尽管上面的示例显示了4个块,但我可能拥有更多或更少的块,但没有确定的数字可使用。我尝试使用CONNECT BY和REGECP_COUNT来运行所有事件,但没有结果,regexp_count是11g起。

理想情况下,我想得到的是这样的东西;

ID       ENTITY                          ACTION                     DATE                          LOCK_NOTES
-------  ------------------------------- -------------------------- ----------------------------- ---------------------------------------------------------------------
11652907 LOCKED ENTITY: ACCOUNT          LOCKED BY USER: OPS        LOCKED AT: 11/06/2004 09:11   LOCK NOTES: ACCT Locked
11652907 LOCKED ENTITY: USER             LOCKED BY USER: OPS        LOCKED AT: 11/06/2004 09:58   LOCK NOTES: User Locked
11652907 UNLOCKED ENTITY: USER           UNLOCKED BY USER: OPS      UNLOCKED AT: 11/06/2004 20:05 UNLOCK NOTES: User now aware.

然后我将能够基于日期进行查询并提取相关记录。

任何帮助将不胜感激。

谢谢。

sql regex oracle oracle10g
1个回答
1
投票

[您可以使用regexp_substr(str,'^.*+$',1,level,'m')提取每一行以及level结构中的select..connect by level伪装确定行号,并按每六行分组:

with tab as
(
select regexp_substr(str,'^.*+$',1,level,'m') as str, level as rn
  from tab0
connect by level <= instr(str,chr(10))+1
)
select max(case when mod(rn,6)=1 then str end) as "ENTITY",
       max(case when mod(rn,6)=2 then str end) as "ACTION",
       max(case when mod(rn,6)=3 then str end) as "DATE",
       max(case when mod(rn,6)=4 then str end) as "LOCK_NOTES"
  from tab
 group by ceil(rn/6);

其中Chr(10)是换行符

Demo

© www.soinside.com 2019 - 2024. All rights reserved.