我有一些表(Oracle DB)和一些产品:
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).*')
但它不起作用并返回空结果。 regexp的语法错在哪里?
答案 0 :(得分:1)
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');
答案 1 :(得分:0)
只有一个条件:
SELECT *
FROM TABLENAME
WHERE
REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s')
> REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s+test')