2016-12-02 51 views
2

我想使用jooq api構建類似下面的查詢。我可以建立一個jooq查詢到一個偏移量嗎?

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

通過

select(x.fields()).from(x) 
    .offset(param(greatest(val(0), select(count().sub(1)).from(x).field(0, Integer.class)))) 

我敢肯定,我使用的是offset(Param<Integer>)方法不正確。它似乎是爲偏移量渲染null。正在構建像這樣的偏移量嗎? (看起來offset方法與jooq api的其餘部分相比有點受到限制)。

(我知道沒有上下文的查詢似乎效率低下,但它實際上是我想要做的)

謝謝!

+0

問題是:你可以在你的數據庫中做到這一點嗎? (你的數據庫是什麼?) –

+1

是的。可以在postgres中完成。我實際上是用CTE做的,但事實證明它不僅限於CTE。 – dsmith

回答

1

我不認爲任何數據庫允許你把他們 OFFSETLIMIT條款 非常量表達式(它可能在PostgreSQL裏,看到dsmith的評論)。無論如何,jOOQ不允許你這樣做。您必須提供常數int值或綁定變量(Param)。

但無論如何,你並不需要這個功能。假想的語法...

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

等效於此:

select x.* 
from x 
order by <implicit ordering> desc 
limit 1; 

畢竟,您的查詢似乎是在尋找最後行(通過一些隱含的順序),那麼爲什麼不只是明確表達?

+0

上面提到,但這是合法的postgres語法。當我拿到表格時,原來的排序字段不存在(所以我不能逆轉排序)。將不得不在更高級別重新查詢我的查詢,以獲得我想要的結果。 不管怎樣,只要確認jooq不允許像這樣構建查詢。謝謝。 – dsmith

+0

@dsmith:哦,謝謝你的指針。我沒有意識到這一點。我爲此創建了一項功能請求:https://github.com/jOOQ/jOOQ/issues/5695。當然,你可以通過攔截生成的SQL字符串並修補自己的OFFSET表達式來解決jOOQ的限制。例如。使用'ExecuteListener' –

相關問題