2015-08-17 89 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