在 Oracle 正则表达式中等价于 ?=



我正在尝试用regexp_substr()编写正则表达式。

例如,我有一个字符串DA.*BLK,我想提取AB之间的任何内容。我现在正在做的是使用

replace(replace(regexp_substr(target_column,'A.*B'),'A',''),'B','')` 

然后我得到介于两者之间的任何东西。

但我认为这种方式可能效率不高,也不优雅。我也尝试在那里使用?=,但似乎 Oracle 不支持这样的条款。 任何人都可以让我知道实现我的目的的更好方法吗?谢谢!

使用提取组

REGEXP_SUBSTR('DASOMETHINGBLK','DA(.*)BLK', 1,1,NULL,1)
--                           ^ ^      ^
--starting from first, find first     1st match bet'n ()

http://sqlfiddle.com/#!4/97eade/967

您不需要正则表达式,可以使用LIKE运算符和字符串函数:

甲骨文设置

CREATE TABLE table_name ( id, column_name ) AS
SELECT 1, 'dablk' FROM DUAL UNION ALL
SELECT 2, 'datestblk' FROM DUAL UNION ALL
SELECT 3, 'atestblk' FROM DUAL UNION ALL
SELECT 4, 'datestbl' FROM DUAL UNION ALL
SELECT 5, 'dadatestblkblk' FROM DUAL;

查询- 对于以da开头并以blk结尾的字符串:

SELECT id,
SUBSTR( column_name, 3, LENGTH( column_name ) - 5 )
FROM   table_name
WHERE  column_name LIKE 'da%blk';

结果

ID | SUBSTR(COLUMN_NAME,3,LENGTH(COLUMN_NAME)-5)
---|--------------------------------------------
1 | (null)
2 | test
5 | datestblk

查询- 对于带有a的字符串,则b

SELECT id,
SUBSTR(
column_name,
first_a + 1,
last_b - first_a - 1
) AS value
FROM   (
SELECT t.*,
INSTR( column_name, 'a' ) AS first_a,
INSTR( column_name, 'b', -1 ) AS last_b
FROM   table_name t
WHERE  column_name LIKE '%a%b%'
)

结果

ID | VALUE    
---|----------
1 | (null)
2 | test     
3 | test     
4 | test     
5 | datestblk

db<>小提琴在这里

最新更新