MySQL到PostgreSQL查询别名分组依据

MySQL到PostgreSQL查询别名分组依据,mysql,postgresql,group-by,sql-order-by,alias,Mysql,Postgresql,Group By,Sql Order By,Alias,我有一张像这样的桌子 id | number --------------- 1 56721 2 56722 3 43981 4 43982 5 43983 6 43984 对此,对应的PostgreSQL查询是什么?为了更清楚,请将其包装到子查询中: SELECT class, subclass FROM ( SELECT CASE substr(number,1,2) WHEN '5

我有一张像这样的桌子

id | number --------------- 1 56721 2 56722 3 43981 4 43982 5 43983 6 43984
对此,对应的PostgreSQL查询是什么?

为了更清楚,请将其包装到子查询中:

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;
若这个数字实际上存储为一个对我来说有意义的数字,那个么您需要处理类型转换。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子句中的比较改为子类“other”。没有名为other的列,因此我假设您指的是值。

对于您的答案,PostgreSQL给我一个类似列表的错误。数字必须出现在GROUP BY子句中或用于聚合function@Revan您是从当前的答案中还是从以前的版本中得到这个错误的?因为我看不出它是如何发生在当前的一个上的。对于您的答案,PostgreSQL给我一个类似列table的错误。numstr必须出现在GROUP BY子句中或在聚合中使用function@RevanDarth . . . 这毫无意义。您是否有一个子查询的计数*?它应该只出现在外部查询上。
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;