2011-12-14 6 views
0

selectの一部として関数呼び出しと定数を含み、エイリアスを使用するSequelデータセットを作成する方法を理解しようとしています。私は正しい構文に固執しています。定数の続編フォーマット、関数は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 
; 

同等の、無作為なSequelは何ですか?これまでのところ私が持っている:

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

あなたはより簡潔な方法をしたい場合は、仮想行ブロックでちょうどselectメソッドを使用し、トリプルアンダースコアの記号を使用して、暗黙的なエイリアシングを使用することができます。

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

これは、全く同じではありません選択した列の順序は異なりますが、通常は問題になりません。

+0

Cool。 BTW:Sequel式の順序と比較して、結果のSQLでSELECTの順序が保証されていますか?私は 'setseed'がいつも起こるかどうか確認したいと思っています* PostgreSQLの場合' DB [:T ___ t] {setseed(t__id)} {random {}。as(mysort)} ' * randomの前に。 – jwfearn

+1

メソッドの引数((...)内のもの)は、ブロックによって返されるもの({..}内のもの)の前にあります。あなたの場合、両方のブロックを使いたいとします: 'DB [:T ___ t] .select {[setseed(t__id)、random {}。as(mysort)}}' –

+0

'lit'メソッドはここには存在しません。 .. これ、どこから来たの?? – brauliobo

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)) 

、誰もがより簡潔または慣用的な方法を知っている場合これを表現して、共有してください。

関連する問題