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;