2011-12-14 2 views
0

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 
; 

등가물, 후속편은 무엇입니까? 지금까지 내가 가진 :

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

차갑다. BTW : Sequel 식의 순서와 비교하여 결과 SQL의 SELECT 순서에 대한 보증이 있습니까? 예를 들어 (PostgreSQL에서)'{[T ___ t] {setseed (t__id)} {{{{{{mysort {}} {{{{{{}} {{{}} {setseed}}} * 랜덤 이전. – 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)) 

사람에 더 간결 또는 관용적 방법을 알고있는 경우 이것을 표현하고 공유하십시오. 좀 더 간결한 방법을 원한다면, 당신은 트리플 밑줄 기호를 사용하여 암시 앨리어싱을 사용할 수 있습니다

관련 문제