2011-01-19 2 views
0

, 당신은 12 개 행이 있다는 것을 나타 내기 위해멋지게 사용하지 않고, 선택과 표현에 의해 그룹화 경우-때 MySQL의에서

 
    bar > 2 count 
    -------------- 
     0  12 
     1  26 

같은 결과를 얻을 수

select bar > 2, count(*) from foo group by (bar > 2) 

처럼 좋은 일을 할 수있다 bar가있는 < = 12 및 26 bar> 12

AS/400의 DB2 데이터베이스에서 동일한 작업을 수행하려고합니다. 이 조항에 의해 선택 또는 그룹의 표현을 좋아하지 않는다, 그러나 당신이 작동

select when (bar > 2) then 1 else 0 end, count(*) from foo 
    group by when (bar > 2) then 1 else 0 end 

를 사용하는 것으로 해결할 수 있지만, 물론 그것은 매우 추한입니다. 제 질문은 : 이것을하기에 더 좋은 방법이 있습니까? 특히 수십 가지 표현에 대해 통합 된 값을이 방식으로 검색하는 것을 고려할 때 특히 그렇습니까? 아마도 제가 간과하고있는 표준 준수 방법조차도있을 것입니다.

편집 : 표준을 준수하는 방법은 무엇인가?

답변

4

멋진 방법이 없다고 생각하면 부울에서 int로 직접 형변환하는 방법이없는 것 같습니다. CASE WHEN은 표준을 준수하며 표현을 반복하지 않도록 서브 쿼리 할 수 ​​있습니다.

select bar2, count(*) 
from 
(
    select CASE when (bar > 2) then 1 else 0 end as bar2 
    from foo 
) SQ 
group by bar2 

또는

select bar2, foobar2, count(other1) 
from 
(
    select 
     CASE when (bar > 2) then 1 else 0 end as bar2, 
     other1, 
     CASE when foobar=1 then 2 when foobar<10 then 1 else 0 end as foobar2 
    from foo 
) SQ 
group by bar2, foobar2 

SQL-92의 텍스트는이 노트의 시간에 http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt에서 확인할 수 많은 분야

는, 링크 자체는 위키 백과에서 해제되었다. CASE 문에 사양 2 케이스를 포함 :

 <simple case> ::= 
      CASE <case operand> 
      <simple when clause>... 
      [ <else clause> ] 
      END 

    <searched case> ::= 
      CASE 
      <searched when clause>... 
      [ <else clause> ] 
      END 
=> 내가 사용할 수있는 표준의 사본을 가지고 있지만,이 질문이 검증 개방 이후 내 실험을하지 않는
+0

"표준을 준수입니다 CASE"는 sqlite3를 작동 , MySQL 및 AS/400 DB2. – Confusion

관련 문제