oracle 使用regexp_substr从第三行捕获字符串

hmtdttj4  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(137)

我需要帮助来捕获所有的字符串在第三行使用REGEXP_SUBSTR。第三行中的字符串变化。我尝试了下面的模式,但它捕获其他行我只需要第三行,(abc| rty| qer)在这个字符串变化时不起作用。
图案:REGEXP_SUBSTR(Datasource,’(abc|rty|qer).*’)
数据源:

abc def ghi
pqr stu vwx
abc dfg qrt
zxc qet qwr

qep rty djf
ety fjf fjf
rty fgg tyy
rty tyy ffg

qwr tyy yyy
qer ggg rrf
qer ttg ggg
prw rjr trt

预期结果:

abc dfg qrt
rty fgg tyy
qer ttg ggg
qyzbxkaa

qyzbxkaa1#

正则表达式比普通的字符串函数慢。您可以简单地使用INSTRSUBSTR来查找第三行:

SELECT SUBSTR(
         datasource,
         INSTR(datasource, CHR(10), 1, 2) + 1,
         INSTR(datasource, CHR(10), 1, 3) - INSTR(datasource, CHR(10), 1, 2)
       ) AS third_line
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name (datasource) AS
SELECT 'abc def ghi
pqr stu vwx
abc dfg qrt
zxc qet qwr' FROM DUAL UNION ALL
SELECT 'qep rty djf
ety fjf fjf
rty fgg tyy
rty tyy ffg' FROM DUAL UNION ALL
SELECT 'qwr tyy yyy
qer ggg rrf
qer ttg ggg
prw rjr trt' FROM DUAL;

输出:
| 第三行|
| --|
| abc dfg qrt|
| rty fgg tyy|
| qer ttg ggg|
fiddle

shstlldc

shstlldc2#

你在一个列中存储一个多行字符串,你需要第三行。
你想使用REGEXP_SUBSTR
对于多行字符串,使用匹配参数'm '。默认情况下,点与新行不匹配,因此开始的'^'和结束的'$'指的是一行。你想要第三个,所以:

select regexp_substr(str, '^.*$', 1, 3, 'm')
from mytable;

演示:https://dbfiddle.uk/5Cb90_M1

yx2lnoni

yx2lnoni3#

在这种情况下,您不需要regex,只需索引。将您的数据源想象为

data_source = readLines(textConnection('abc def ghi
pqr stu vwx
abc dfg qrt
zxc qet qwr

qep rty djf
ety fjf fjf
rty fgg tyy
rty tyy ffg

qwr tyy yyy
qer ggg rrf
qer ttg ggg
prw rjr trt'))[c(1:4, 6:9, 11:14)] # to take out `\n` newlines

array(data_source, dim = c(4,3,1))
, , 1

     [,1]          [,2]          [,3]         
[1,] "abc def ghi" "qep rty djf" "qwr tyy yyy"
[2,] "pqr stu vwx" "ety fjf fjf" "qer ggg rrf"
[3,] "abc dfg qrt" "rty fgg tyy" "qer ttg ggg"
[4,] "zxc qet qwr" "rty tyy ffg" "prw rjr trt"

# check if we're on the right track with this array, appears so
data_arr = array(data_source, dim = c(4,3,1))

as.matrix(data_arr[3, , ], ncol = 1)
     [,1]         
[1,] "abc dfg qrt"
[2,] "rty fgg tyy"
[3,] "qer ttg ggg"

因此,在适用的情况下,使用索引而不是正则表达式。

相关问题