2011-12-14 21 views
0

我想弄清楚如何創建一個Sequel數據集,其中包含函數調用和常量作爲其select的一部分並使用別名。我堅持正確的語法。常量的續集格式,select中的函數調用?

我試圖避免插入原始SQL,但我會如果我必須,只要我可以鏈結果數據集並引用原始SQL內的列別名。

我實際的查詢是更復雜(我沒有實際調用sin,它只是一個函數調用的例子),但爲了便於說明,這裏有我想要在SQL做一個精簡版:

SELECT 
    0 AS a,    -- constant 
    sin(t.x) AS b,  -- function call with aliased column value argument 
    t.x AS c 
FROM 
    T AS t 
; 

什麼是相當的,idomatic,續集?到目前爲止,我有:

DB[:T.as(:t)]. 
    select(
     #0 as a,  # How? constant 
     #sin(t.x) as b, # How? function call with aliased column value argument 
     :t__x.as(:c) 
    ) 

回答

2

如果你想要一個更簡潔的方式,你可以用符號具有三重底線使用隱走樣,只使用選擇方法與虛擬行塊:

DB[:T___t].select('0'.lit.as(:a), :t__x___c){sin(t__x).as(b)} 

這是不完全一樣的所選列的順序不同,但通常無關緊要。

+0

很酷。順便說一句:與Sequel表達式中的順序相比,生成的SQL中SELECT的順序是否有保證?例如(在PostgreSQL上)`DB [:T ___ t] {setseed(t__id)} {random {}。as(mysort)}`[抱歉,如果這是不正確的語法]我想確保`setseed`總是發生*之前*`隨機`。 – jwfearn 2011-12-17 00:01:58

0

後的優秀Sequel docs多閒逛,我想出了以下的解決方案,爲我工作:

DB[:T.as(:t)]. 
    select_more('0'.lit.as(:a)). 
    select_more(:sin.sql_function(:t__x).as(:b)). 
    select_more(:t__x.as(:c)) 

如果有人知道一個更簡潔的或慣用的方式表達這一點,請分享。