Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SqlExceptionHelper:错误:函数计数(字符变化,整数)不存在_Sql_Postgresql - Fatal编程技术网

SqlExceptionHelper:错误:函数计数(字符变化,整数)不存在

SqlExceptionHelper:错误:函数计数(字符变化,整数)不存在,sql,postgresql,Sql,Postgresql,我有一个spring应用程序,还有一个本机查询,语法如下: select COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Satisfactory' THEN 1 END)) AS totalSatisfactory, COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Unsatisfactory' THEN 1 END)) AS t

我有一个spring应用程序,还有一个本机查询,语法如下:

select  
    COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Satisfactory' THEN 1 END)) AS totalSatisfactory, 
    COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Unsatisfactory' THEN 1 END)) AS totalUnsatisfactory
    from person
    join salary_person on person.id = salary_person.person_id;   
我得到一个错误:

 ERROR: function count(character varying, integer) does not exist

作为数据库,我使用PostgreSQL。我提到在mysql中,查询是有效的。

Postgres不支持包含多个列的
count()。但是,您只需使用类似于:
(col\u one,col\u two)
-即匿名记录类型的单个列,即可将两列转换为匿名记录类型的单个列

select COUNT(DISTINCT (person.id,(CASE WHEN salary_person.rating = 'Satisfactory' THEN 1 END))) AS totalSatisfactory, 
       COUNT(DISTINCT (person.id,(CASE WHEN salary_person.rating = 'Unsatisfactory' THEN 1 END))) AS totalUnsatisfactory
from person
  join salary_person on person.id = salary_person.person_id;   
请注意两列周围的括号


然而,在Postgres中,您有一种更优雅的方式来做您想做的事情,通过使用带有
过滤器的条件聚合
子句:

select COUNT(DISTINCT person.id) filter (where salary_person.rating = 'Satisfactory') AS totalSatisfactory, 
       COUNT(DISTINCT person.id) filter (where salary_person.rating = 'Unsatisfactory') AS totalUnsatisfactory
from person
  join salary_person on person.id = salary_person.person_id;