2011-01-19 7 views
0

を使用せずに、あなたは12行があることを示すためにが素敵な式で選択し、グループ化、MySQLの場合、とき

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

のような結果を得るために

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

のような素敵なことを行うことができますバー付き< = 12と26バー> 12

私はAS/400のDB2データベースで同じことをしたいと思います。それはby句の選択やグループでの表現が好きではありませんが、これは動作します

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

関連する問題