问题:
SELECT * FROM
(SELECT '未发生基因突变' result_std FROM dual
UNION ALL
SELECT '无明显突变' FROM dual
UNION ALL
SELECT '野生型突变' FROM dual
UNION ALL
SELECT '突变' FROM dual)
对于以上数据,
目的:查询出突变前的数据中不包含未、无关键字;即:
查询出:野生型突变、突变
方法一:截取文本的基础上再嵌套一层正则(效率较低)
SELECT result_std
FROM
(SELECT '未发生基因突变' result_std FROM dual
UNION ALL
SELECT '无明显突变' FROM dual
UNION ALL
SELECT '野生型突变' FROM dual
UNION ALL
SELECT '突变' FROM dual)
WHERE regexp_instr(regexp_substr(result_std,'.*突变'),'未|无')=0
结果:

对于数据量较大的情况,在正则截取的基础上继续嵌套使用正则,效率较低
方法二:使用反向排除法
SELECT result_std
FROM
(SELECT '未发生基因突变' result_std FROM dual
UNION ALL
SELECT '无明显突变' FROM dual
UNION ALL
SELECT '野生型突变' FROM dual
UNION ALL
SELECT '突变' FROM dual)
WHERE NOT regexp_like(result_std,'[未无].*突变')
结果:

注意:
SELECT result_std
FROM
(SELECT '未发生基因突变' result_std FROM dual
UNION ALL
SELECT '无明显突变' FROM dual
UNION ALL
SELECT '野生型突变' FROM dual
UNION ALL
SELECT '突变' FROM dual)
WHERE regexp_like(result_std,'[^未无]*突变')
结果:

最后一条正则表达式并不能达到目的,是因为正则会匹配文本中任意一个表达式符合正则写法的数据,
例如第一条:虽然未发生基因突变不符合要求,但发生基因突变,生基因突变,基因突变,因突变,突变均符合要求,
依照正则符合一条即为真的原则,以上几条均符合要求
本文介绍了如何在Oracle数据库中使用正则表达式查询出不包含'未'和'无'关键字的突变数据。讨论了两种方法,包括通过截取文本再嵌套正则表达式(效率较低)和使用反向排除法。然而,反向排除法的正则表达式可能因匹配部分符合要求的文本而导致误判。
2491

被折叠的 条评论
为什么被折叠?



