2017-10-24 3 views
1

에서 구문 표현은 내가케이스 jooq

select case  
when year(d.date) - p.birth_year < 5 then '<5' 
else '5+' 
end as age 
from partners p join departure d on d.id = p.id 

당신은 무엇을 찾고있는 것 같다 것은 SQL입니다

this.schema().select(
DSL.decode().value(dateDiff(p.BIRTHDATE , date(d.DATE))) 
    .when(greaterThan(5), "above 5") 
    .when(lessThan(5), "under 5") 
    .otherwise("unknown").as("age"), 
    .from(p) 
    .join(d).on(d.ID.eq(p.ID)) 

답변

1

에 jooq이 MySQL의 쿼리를 재현하려고하는 경우 : 2003 간단한 CASE 표현, 다른 언어로 패턴을 매칭하는 것과 비슷한 케이스 값에 따라 "부분 술어"와 같은 것을 형성 할 수 있습니다. jOOQ에서는 아직 지원되지 않습니다 (Issue #3223 참조).

흥미롭게도 SQL 예제는이 구문을 사용하지 않으며 제안 된 jOOQ API 사용법에도 해당하지 않습니다. 나는이 구문을 사용하여 뺄셈을 두 번 반복하지 않기를 원한다고 생각합니다. 이것은 다음과 같이 SQL에서, 또한 할 수있다 :

select 
    case sign(year(d.date) - p.birth_year - 5) 
    when -1 then '<5' 
    when 0 then '5+' 
    when 1 then '5+' 
      else 'unknown' end AS age 
from partners p join departure d on d.id = p.id 

이가 번역 것 :

이 정적 가져 오기 암시
Partners p = PARTNERS.as("p"); 
Departure d = DEPARTURE.as("d"); 

using(configuration) 
    .select(choose(sign(year(d.DATE).minus(p.BIRTH_YEAR).minus(5))) 
     .when(inline(-1), val("<5")) 
     .when(inline(0), val("5+")) 
     .when(inline(1), val("5+")) 
     .otherwise(inline("unknown")) 
     .as("age")) 
    .from(p) 
    .join(d).on(d.ID.eq(p.ID)) 
    .fetch(); 

:

import static org.jooq.impl.DSL.*; 
+0

을 내가 esp 레지스터 찾고 있었다 exatly 무엇 'inline (-1)'표기법. 명확하고 정교한 솔루션을 제공해 주셔서 감사합니다. '정적 가져 오기 '를 제공하기위한 +10 많은 해결책이 그 부분을 남깁니다. – joseph

+1

@joseph : 좋은 단어를 가져 주셔서 감사합니다. 네, 실제로 DSL.inline()은 종종 간과됩니다. 이에 대한 자세한 내용은 다음과 같습니다. https://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters –