Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
Regex 从Oracle中的SQL语句提取连接条件定义_Regex_Oracle - Fatal编程技术网

Regex 从Oracle中的SQL语句提取连接条件定义

Regex 从Oracle中的SQL语句提取连接条件定义,regex,oracle,Regex,Oracle,假设使用了ANSI符号,我试图找出一种模式,可以在SQL查询中提取to表之间的连接条件子句 例如,给定查询: Select a.*, b.*, c.*, d.* from a inner join b on a.c1 = b.c1 left outer join c on c.c3 = b.c3 and b.c4 = c.c4 and c.c5 = b.c5 right join d on d.c9 = c.c9 where d.c10 > 67

假设使用了ANSI符号,我试图找出一种模式,可以在SQL查询中提取to表之间的连接条件子句

例如,给定查询:

Select a.*, b.*, c.*, d.*
  from a
 inner join b
   on a.c1 = b.c1
 left outer join c on
      c.c3 = b.c3 and b.c4 = c.c4
     and c.c5 = b.c5
 right join d on
  d.c9 = c.c9 
where d.c10 > 67 ;
我想得到:

1)  b
   on a.c1 = b.c1
2) c on
      c.c3 = b.c3 and b.c4 = c.c4
     and c.c5 = b.c5
3)  d on
  d.c9 = c.c9
我知道这项任务不是那么容易,但我不想让它完美地工作,所以比赛中的一些噪音被认为是可行的。请注意,噪音将在后续任务中处理

我正在Oracle中搜索USER_视图,因此为了使用REGEXP_*函数,我创建了一个源表来读取:

create table appo_view_text (viewname varchar2(30), viewtext clob);
insert into appo_view_text
 SELECT VIEW_NAME,to_lob(TEXT) FROM USER_VIEWS;
commit;
下面是提取我要查找的内容的查询:

with cfg as (
  select '(INNER\s+JOIN|LEFT(\s+OUTER)?\s+JOIN|RIGHT(\s+OUTER)?\s+JOIN).+?(\1|WHERE|GROUP BY|$)' pattern
       , 'i' modifiers
    from dual
)
SELECT VIEWNAME, REGEXP_SUBSTR(sourcetxt, cfg.pattern, 1, level, cfg.modifiers) aa, viewtext
  FROM ( select viewname,
                viewtext, 
                replace(replace(viewtext,chr(13)||chr(10),' '), chr(10), ' ') sourcetxt
                from appo_view_text 
                where viewname = 'YOUR_VIEW_NAME') --> Put here a view name
  cross join cfg
 connect by level <= regexp_count(sourcetxt, cfg.pattern, 1, cfg.modifiers)
 ;
您将注意到正则表达式模式有一个问题,正如上面查询中定义的那样:\1 |$元素将导致文本中一半匹配项丢失。 我尝试改用?:\1 |$,但结果只有一行包含空字符串


有什么想法吗?

我想我自己得到了答案:

with cfg as (
  select '(\WON\W).+?(WHERE|GROUP BY|(INNER\s+JOIN|LEFT(\s+OUTER)?\s+JOIN|RIGHT(\s+OUTER)?\s+JOIN|CROSS\s+JOIN)|$)' pattern
       , 'i' modifiers
    from dual
)
SELECT VIEWNAME, REGEXP_SUBSTR(sourcetxt, cfg.pattern, 1, level, cfg.modifiers) aa, viewtext, sourcetxt
  FROM ( select viewname,
                viewtext, 
                replace(replace(viewtext,chr(13)||chr(10),' '), chr(10), ' ') sourcetxt
                from appo_view_text 
                where viewname = 'VILASTAZIONE') --> Put here a view name
  cross join cfg
 connect by level <= regexp_count(sourcetxt, cfg.pattern, 1, cfg.modifiers)
 ;

我想我自己得到了答案:

with cfg as (
  select '(\WON\W).+?(WHERE|GROUP BY|(INNER\s+JOIN|LEFT(\s+OUTER)?\s+JOIN|RIGHT(\s+OUTER)?\s+JOIN|CROSS\s+JOIN)|$)' pattern
       , 'i' modifiers
    from dual
)
SELECT VIEWNAME, REGEXP_SUBSTR(sourcetxt, cfg.pattern, 1, level, cfg.modifiers) aa, viewtext, sourcetxt
  FROM ( select viewname,
                viewtext, 
                replace(replace(viewtext,chr(13)||chr(10),' '), chr(10), ' ') sourcetxt
                from appo_view_text 
                where viewname = 'VILASTAZIONE') --> Put here a view name
  cross join cfg
 connect by level <= regexp_count(sourcetxt, cfg.pattern, 1, cfg.modifiers)
 ;
试试这个正则表达式: ?i?试试这个正则表达式:
?i?如果将viewtext合并到一行中,则可以创建多个匹配组,如从t1.col=t2.col和t2.col2=t1.col3内部/左侧联接上的表1内部/左侧联接表2中选择某物。。。。。。。哪里所以大括号中的所有组都是要返回的组。这听起来像是您想要的吗?我没有在表中合并视图文本,但我在提取查询see sourcetext列中合并了视图文本。这没有帮助,尽管这里的主要问题是找到新表的开始,是吗?如果我们在下一个内/左/右连接处停止搜索?正如我所写的,在匹配中加入一些噪音是可行的。如果你在某些特定的词上停止搜索,这应该很容易做到,是的^^我会添加一个答案,即使你找到了答案。如果将viewtext合并到一行中,则可以创建多个匹配组,如从t1.col=t2.col和t2.col2=t1.col3内部/左侧连接的表1中选择内容。。。。。。。哪里所以大括号中的所有组都是要返回的组。这听起来像是您想要的吗?我没有在表中合并视图文本,但我在提取查询see sourcetext列中合并了视图文本。这没有帮助,尽管这里的主要问题是找到新表的开始,是吗?如果我们在下一个内/左/右连接处停止搜索?正如我所写的,在匹配中加入一些噪音是可行的。如果你在某些特定的词上停止搜索,这应该很容易做到,是的^^我会添加一个答案,即使你找到了答案。这可能会给你一些想法,因为它会起作用,但Oracle不支持环顾操作符?=@Max:哦,好吧,我不知道,对不起。。。我会更新我的答案。它会起作用,但Oracle不支持环顾操作员?=@Max:哦,好吧,我不知道,对不起。。。我会更新我的答案。