PostgreSQL,SELECT CASE COALESCE

时间:2014-12-04 17:44:48

标签: sql postgresql case aggregate

我需要' name'类别:mycattext列,可能的值为'0''4'

SELECT CASE mycat                                       
       WHEN '0' THEN 'ZERO'                         
       WHEN '1' THEN 'ONE'                      
       WHEN '2' THEN 'TWO'                      
       WHEN '3' THEN 'THREE'                        
       WHEN '4' THEN 'OTHER'        
   END AS my_category,
   COALESCE(SUM(col1), 0), 
   COALESCE(SUM(col2), 0), 
   COALESCE(SUM(col3), 0) 
   FROM mytable 
GROUP BY mycat 
ORDER BY mycat;

这样可行,但我的程序中有一些错误很少写null(或'',我可以在pgAdmin中看到)。在这种情况下,我必须将''视为与'0'相同。 但我无法做到!

我试着这样:

SELECT CASE COALESCE(mycat, '0')

但这根本无法解决 如何将''汇总并与'0'类别组合在一起?

PostgreSQL 9.3,Windows。

2 个答案:

答案 0 :(得分:6)

你需要在group byorder by中使用COALESCE,也类似于你计划更改case表达式的方式,但是postgres会给出错误,所以另一个选择是包装你的子查询中的语句并执行group by

SELECT my_category, 
       COALESCE(SUM(col1), 0), 
       COALESCE(SUM(col2), 0), 
       COALESCE(SUM(col3), 0) 
FROM
(
SELECT CASE coalesce(mycat ,'0')                                     
       WHEN '0' THEN 'ZERO'                         
       WHEN '1' THEN 'ONE'                      
       WHEN '2' THEN 'TWO'                      
       WHEN '3' THEN 'THREE'                        
       WHEN '4' THEN 'OTHER' 
       WHEN '' THEN 'ZERO'       
   END AS my_category,
   col1,
   col2,
   col3
   FROM mytable 
) T
GROUP BY my_category
ORDER BY my_category

答案 1 :(得分:3)

你可以没有子查询。您可以在GROUP BY和ORDER BY子句中重复该表达式。但是,使用输出列的序号来更简单

SELECT CASE mycat
         WHEN '1' THEN 'ONE'
         WHEN '2' THEN 'TWO'
         WHEN '3' THEN 'THREE'
         WHEN '4' THEN 'OTHER'
         ELSE          'ZERO'  -- catches all other values
       END AS my_category
    ,  COALESCE(SUM(col1), 0) AS sum1
    ,  COALESCE(SUM(col2), 0) AS sum2
    ,  COALESCE(SUM(col3), 0) AS sum3
FROM   mytable 
GROUP  BY 1
ORDER  BY 1;

我选择了最简单,最快的代码。 ELSE分支捕获0''NULL - 或尚未过滤的任何其他值!但是你说没有其他人。

几个咆哮:

  • mycat is 'text' column with possible values '0' to '4'.
    这有两个方面是错误的。
    1. 您显然还有空字符串('')和/或NULL值。
    2. integer, smallint, "char" or enum是数据类型的明智选择。 text不是。
  • 要找出您的实际值范围:

    SELECT mycat, count(*) AS ct FROM mytable GROUP BY 1 ORDER BY 2 DESC;
    

    pgAdmin使用默认设置显示空字符串a'',但不显示NULL
    如果您不确定,请使用mycat IS NULL进行测试。您需要了解并了解许多情况下的差异。

  • my_category生成的文字排序? ONE, OTHER, THREE, TWO, ZERO?我怀疑你想要那个。为了简单起见,您可以输出:0, 1, 2, 3, OTHER