问题:
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,'[^未无]*突变')
结果:
最后一条正则表达式并不能达到目的,是因为正则会匹配文本中任意一个表达式符合正则写法的数据,
例如第一条:虽然未发生基因突变不符合要求,但发生基因突变,生基因突变,基因突变,因突变,突变均符合要求,
依照正则符合一条即为真的原则,以上几条均符合要求