2011-01-19 47 views
0

在MySQL中,你可以像奈斯利選擇和表達分組,在不使用的情況下,當

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

好話得到像

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

結果表明,有12個行與酒吧< = 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語句規範包括兩種情況:

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

    <searched case> ::= 
      CASE 
      <searched when clause>... 
      [ <else clause> ] 
      END 
+0

「CASE WHEN是符合標準的」 =>我沒有可用的標準的一個副本,但開業以來這個問題驗證這一點我的實驗:它適用於SQLITE3 ,MySQL和AS/400 DB2。 – Confusion 2011-01-19 10:45:40

相關問題