Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
Sql 多次返回一个模式_Sql_Oracle - Fatal编程技术网

Sql 多次返回一个模式

Sql 多次返回一个模式,sql,oracle,Sql,Oracle,我有一个名为comment的列,其中可以包含多达5次的特定模式,我想返回所有模式。以下是我的Column中的值: oijdwe wbjcwe sbr('JOJ.TTT.ABC',test)sdfjksj dlkfjs lkf QWEUH ('JOJ.TTT.123',测试)oiiqwd m lskc第一区('JOJ.TTT.452',测试)ksd sdfskq azx('JOJ.TTT.ACD5',测试) 我想返回以下值:JOJ.TTT.ABC,JOJ.TTT.123,JOJ.TTT.452和J

我有一个名为
comment
的列,其中可以包含多达5次的特定模式,我想返回所有模式。以下是我的Column中的值:

oijdwe wbjcwe sbr('JOJ.TTT.ABC',test)sdfjksj dlkfjs lkf QWEUH ('JOJ.TTT.123',测试)oiiqwd m lskc第一区('JOJ.TTT.452',测试)ksd sdfskq azx('JOJ.TTT.ACD5',测试)

我想返回以下值:
JOJ.TTT.ABC
JOJ.TTT.123
JOJ.TTT.452
JOJ.TTT.ACD5

当使用以下语句时

 select 
     regexp_substr(comment,'JOJ.T{3}.{4}',1,1)
     ,regexp_substr(comment,'JOJ.T{3}.{4}',1,2)
     ,regexp_substr(comment,'JOJ.T{3}.{4}',1,3)
     ,regexp_substr(comment,'JOJ.T{3}.{4}',1,4)
     ,regexp_substr(comment,'JOJ.T{3}.{4}',1,5)
 from blabla
如果模式为
JOJ.TTT.XXX
,则可以正常工作,但如果“TTT”后面有4个字符,则不能正常工作。我知道这是因为我使用的{4}。我怎样才能得到我想要的结果

谢谢

我找到了修复它的方法


使用
[^']+
进行匹配,直到下一个
'

 select 
      regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,1)   a,
      regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,2)   b,
      regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,3)   c,
      regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,4)   d,
      regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,5)   e
 from blabla;

我已将
comment
更改为
comment\uquot>,因为
comment
是Oracle中的保留关键字。

正则表达式中的
用于此目的,但它也会匹配您不想要的内容,因为它是一个通配符。使用
\.
匹配文本
。您还可以使用
LEVEL
connectby
,这样就不必显式地编写对
REGEXP\u SUBSTR()的多个调用:

WITH x AS (
  SELECT 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1
    FROM dual
)
SELECT REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL)
  FROM x
CONNECT BY REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) IS NOT NULL;

如果您有多个列并希望返回所有列,则会有点麻烦:

WITH x AS (
  SELECT 1 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1
    FROM dual
   UNION ALL
  SELECT 2 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1
    FROM dual
)
SELECT id, REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL)
  FROM x
CONNECT BY REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) IS NOT NULL
    AND PRIOR id = id
    AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;
如果没有
previor
子句,Oracle将返回
id
comment1
值的交叉联接

顺便说一下,
COMMENT
是Oracle保留字,上面的查询在名为
COMMENT
的11GR2中不起作用。这就是为什么我使用了
comment1


或者,您可以使用
[^']+
而不是
[A-Z0-9]+
,但鉴于您的示例数据,我不确定这是您想要的。

我不熟悉sql,因此只能对regex部分进行注释。您可以尝试将
JOJ.T{3}.{4}
更改为'JOJ\.T{3}\.[A-Z0-9]*'。
WITH x AS (
  SELECT 1 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1
    FROM dual
   UNION ALL
  SELECT 2 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1
    FROM dual
)
SELECT id, REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL)
  FROM x
CONNECT BY REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) IS NOT NULL
    AND PRIOR id = id
    AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;