我需要' name'类别: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。
答案 0 :(得分:6)
你需要在group by
和order 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'.
''
)和/或NULL
值。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
。