PostgreSQL 9.6使用基于列和的case when子句

PostgreSQL 9.6使用基于列和的case when子句,sql,postgresql,aggregate-functions,Sql,Postgresql,Aggregate Functions,下面是创建和插入脚本: 如果第1列的和为偶数,则返回其平均值,否则返回0。因此,对于上面的示例,它应该返回[id:1,number1:0] 我试过这个: 它可以与mySql配合使用,但不适用于PostgreSQL(我曾经尝试过)。 PostgreSQL中的错误消息为 ERROR: column "numbers.id" must appear in the GROUP BY clause or be used in an aggregate function 为什么id的预期值是1而不是

下面是创建和插入脚本:

如果第1列的和为偶数,则返回其平均值,否则返回0。因此,对于上面的示例,它应该返回[id:1,number1:0]

我试过这个:

它可以与mySql配合使用,但不适用于PostgreSQL(我曾经尝试过)。 PostgreSQL中的错误消息为

 ERROR: column "numbers.id" must appear in the GROUP BY clause or be used in an aggregate function

为什么
id
的预期值是
1
而不是
2
?这是由查询以任何方式定义的吗?MySql并不关心它,与Postgres(和其他众所周知的RDBMs)相反

如果
id
的值可以忽略不计:

select
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 number1 
---------
       0
(1 row) 
例如,如果要获取
id
的最小值:

select
    min(id) as id,
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 id | number1 
----+---------
  1 |       0
(1 row) 

每次在使用聚合函数时选择列时,该列必须位于GROUP BY列表中。这就是错误告诉您的。感谢您的回答,id是一个不重要的行,正如您所说,它导致了问题。
select
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 number1 
---------
       0
(1 row) 
select
    min(id) as id,
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 id | number1 
----+---------
  1 |       0
(1 row)