Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:获取一个字符串并转换为一个逻辑表?_Sql_Regex_Oracle_Oracle10g - Fatal编程技术网

Oracle SQL:获取一个字符串并转换为一个逻辑表?

Oracle SQL:获取一个字符串并转换为一个逻辑表?,sql,regex,oracle,oracle10g,Sql,Regex,Oracle,Oracle10g,在处理包含注释的字符串varchar4000的列值时,我正在寻找一些建议。我必须根据日期执行提取,但是除了字符串中的时间戳之外,我没有时间戳。我需要提取过去6个月内创建的所有评论。我一直在玩regexp\u SUBSTR,regexp\u INSTR,但由于10g的限制,我无法使用regexp\u count,这让我的生活很困难 绳子看起来像这样 LOCKED ENTITY: ACCOUNT LOCKED BY USER: ops LOCKED AT: 31/05/2004 11:47 CUST

在处理包含注释的字符串varchar4000的列值时,我正在寻找一些建议。我必须根据日期执行提取,但是除了字符串中的时间戳之外,我没有时间戳。我需要提取过去6个月内创建的所有评论。我一直在玩regexp\u SUBSTR,regexp\u INSTR,但由于10g的限制,我无法使用regexp\u 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       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.
然后我可以根据日期查询并提取相关记录

任何帮助都将不胜感激

谢谢。

您可以使用regexp_substrstrstr,“^.*+$”,1,level,“'m”提取每一行以及select中的level pseoducolumn。按级别结构连接以确定行号,并按每六行分组:

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);
其中Chr10是换行字符


不幸的是,它是10g,所以regexp_count不是一个选项:好吧,替换为instr@user7329642Hi,我失去了这样的意愿:由于10g的限制,我已经将表复制到11g实例。使用connect by level时,我不知道您的列的名称,我称之为str,由varchar4000定义。所以,你应该用你的真实列名@user7329642替换str。谢谢,但我不认为这是导致错误的原因,我已经调整了一点,我想我已经成功了;从tab1逐层连接中选择id、regexp_substrVALUE、“^.*+$”、1、level、'm'作为str、level作为rn