0

私はこのようなテーブルを持っています

ID | 番号
---------------
1 56721
2 56722
3 43981
4 43982
5 43983
6 43984

私のMySQLクエリは次のようになります:

SELECT CASE substr(number,1,2) WHEN '56' then 'class1' WHEN '43' then 'class2' else 'other' END as class, 
       CASE substr(number,3,2) WHEN '72' then 'subclass1', WHEN '98' then 'subclass2' ELSE 'other' END as subclass, count(id) as ct 
FROM table GROUP BY class, subclass HAVING class!='other' AND subclass!='other' 
ORDER BY class ASC, subclass DESC;

これに対応する PostgreSQL クエリは何ですか?

4

2 に答える 2

2

より明確にするために、サブクエリでラップします。

SELECT  class, subclass
FROM
    (
        SELECT  CASE substr(number,1,2) WHEN '56' then 'class1' WHEN '43' then 'class2' else 'other' END as class, 
                CASE substr(number,3,2) WHEN '72' then 'subclass1', WHEN '98' then 'subclass2' ELSE 'other' END as subclass 
        FROM    table 
    ) x
GROUP   BY class, subclass 
HAVING  class != 'other' AND subclass != other 
ORDER   BY class ASC, subclass DESC;
于 2013-03-21T13:51:34.833 に答える
0

が実際に数値として格納されている場合number(これは私には理にかなっています)、型変換を処理する必要があります。MySQL はsubstr()数値をサポートしていますが、Postgres はサポートしていません:

SELECT class, subclass, count(*)
FROM (SELECT  (CASE substr(numstr,1,2) WHEN '56' then 'class1'
                                       WHEN '43' then 'class2'
                                       else 'other'
               END) as class, 
              (CASE substr(numstr,3,2) WHEN '72' then 'subclass1'
                                       WHEN '98' then 'subclass2'
                                       ELSE 'other'
               END) as subclass
        FROM (select t.*, cast(number as varchar(255)) as numstr
              from table t
             ) t
    ) t
WHERE class <> 'other' AND subclass <> 'other'
GROUP BY class, subclass 
ORDER BY class ASC, subclass DESC;

havingまた、句の比較を に変更しましたsubclass <> 'other'。という列がないotherので、値のことだと思います。

于 2013-03-21T14:00:31.837 に答える