2015-08-17 83 views
1

我正在使用Doctrine和Oracle数据库结合使用。我大量使用特定于平台的功能,所以我已经创建了一些自定义的DQL函数。但是现在我遇到了一个严重的问题。要使用正则表达式执行LIKE查询,Oracle提供REGEXP_LIKE运算符。它看起来像一个函数,但实际上充当关系运算符。不幸的是,Doctrine只允许我创建自定义函数,而不是运算符。我不能像一个函数那样使用它,因为教义要求我使它成为一个完整的表达式,例如REGEXP_LIKE(foo, bar) != 0。但对于Oracle来说,这是一个语法错误。Doctrine和Oracle REGEXP_LIKE

作为一种变通方法,我用这玩意儿在我的自定义功能DQL的getSql方法:

CASE REGEXP_LIKE(foo, bar) THEN 1 ELSE 0 END 

长相丑陋,但。有没有更好的方式让这个工作在教义?

+1

,你不无论如何都需要DBAL(因为你的应用程序无论如何都不是可移植的)。您可能需要考虑仅使用Doctrine ORM,而不使用DBAL。 – lxg

回答

0

regexp_like在Oracle中只允许在SQL语句的标准部分;但你可以使用才是真正的Oracle功能regexp_count的情况下子句:

select col1, col2, -- etc 
case (regexp_count(col3, '^Hey$')) 
    when 0 then 0 
    else 1 
end as found 
from table; 

因此,对于你的例子REGEXP_LIKE(foo, bar) != 0如果你使用了大量的特定于平台的功能将成为REGEXP_COUNT(foo, bar) != 0