2014-04-12 24 views
2

我有一些产品表(Oracle数据库):如何从oracle的正则表达式中排除单词?

product_1 150 
product_2 250 
product_1 test 150 
product_3 
... etc 

我想取数据只为“product_1”而不是“product_1测试”与只有一个条件。我使用REGEXP_LIKE:

SELECT * 
FROM TABLENAME 
WHERE REGEXP_LIKE(LOWER(PRODUCT), '.*product_1.*(?!test).*') 

但它不起作用并返回空结果。正则表达式的语法错误在哪里?

+0

看起来像你的需要'。* product_1 \ s + [0-9] +' –

+0

@GrijeshChauhan什么是正则表达式中的数字? :)并在哪里排除字?.. –

+0

没有得到你...我的评论的正则表达式不起作用?它应该 –

回答

1

Oracle不支持lookahead。 随着产品为你展示,你可以使用这个:

SELECT * FROM TABLENAME WHERE REGEXP_LIKE(PRODUCT, 'product_\d+(\s*\d+)*', 'c'); 

这只是根据您所显示的产品名称。如果它没有抓住你想要的一切,给我们一个更好的想法,我们正在努力匹配。

另一种选择:这是一个黑客,但如果你有信心,“product_digits”不应该跟着一个“T”,您可以使用此:

SELECT * FROM TABLENAME WHERE REGEXP_LIKE(PRODUCT, 'product_\d+($|\s)($|[^t]).*', 'c'); 
0

只有一个条件:

SELECT * 
FROM TABLENAME 
WHERE 
    REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s') 
    > REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s+test')