我有一些产品的表(Oracle DB):
product_1 150
product_2 250
product_1 test 150
product_3
... etc
我只想获取“product_1”的数据而不是“product_1 test”的数据 只有一个条件 .我为此使用 REGEXP_LIKE:
SELECT *
FROM TABLENAME
WHERE REGEXP_LIKE(LOWER(PRODUCT), '.*product_1.*(?!test).*')
但它不起作用并返回空结果。正则表达式的语法错误在哪里?
最佳答案
Oracle 不支持前瞻。
使用您展示的产品,您可以使用:
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');
关于regex - 如何从oracle的正则表达式中排除一个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23034365/