【问题标题】:PostgreSQL, SELECT CASE COALESCEPostgreSQL,选择案例合并
【发布时间】:2015-02-02 17:13:43
【问题描述】:

我需要“命名”类别:mycat 是一个 text 列,可能的值是 '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。

【问题讨论】:

    标签: sql postgresql case aggregate


    【解决方案1】:

    您需要在 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
    

    【讨论】:

    • 嗨,雷达,这不起作用:错误:列“mytable.mycat”必须出现在 GROUP BY 子句中或用于聚合函数第 1 行:SELECT CASE coalesce(mycat, '0 ')。我做错了什么?
    • @user973238,奇怪的是 postgre 给出错误,所以另一种选择是包装子查询。更新了答案。
    • 不和'0'和''类别。如果我在 'OTHER' 之后添加 ELSE 'ZERO' 然后求和。
    • 我强烈建议在您的脚本中添加 ELSE,以备将来最终不需要的数据。
    【解决方案2】:

    您可以在没有子查询的情况下使用它。您可以在 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 将空字符串显示为 '',但默认设置不显示 NULL
      如果不确定,请使用mycat IS NULL 进行测试。您需要了解和理解许多情况下的区别。

    • 这按my_category 中的结果文本排序? ONE, OTHER, THREE, TWO, ZERO?我怀疑你想要那个。为简单起见,您可以改为输出:0, 1, 2, 3, OTHER

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2018-12-14
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2018-07-17
      • 2011-06-10
      相关资源
      最近更新 更多