【问题标题】:SqlExceptionHelper : ERROR: function count(character varying, integer) does not existSqlExceptionHelper:错误:函数计数(字符变化,整数)不存在
【发布时间】:2022-02-10 05:16:36
【问题描述】:

我有一个 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中,查询是有效的。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    Postgres 不支持超过一列的count()。但是,您可以简单地将两列转换为匿名记录类型的单列,方法是:(col_one, col_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 中,您可以通过使用带有 filter 子句的条件聚合来更优雅地做您想做的事情:

    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;   
    

    【讨论】:

      【解决方案2】:

      不管类型如何,在多列上计算不同的一种快速而肮脏的替代方法是将两列连接到一个列中并计算不同的列

      SELECT
        COUNT(DISTINCT CONCAT(person.id, salary_person.rating))
      FROM person
        JOIN salary_person on person.id = salary_person.person_id; 
      

      但是,根据您想要做的事情,您不能只按评级计算不同并过滤某些评级吗?

      SELECT
        salary_person.rating,
        COUNT(DISTINCT person.id)
      FROM person
        JOIN salary_person on person.id = salary_person.person_id
      WHERE 
        salary_person.rating in ('Satisfactory', 'Unsatisfactory')
      GROUP BY 1; 
      
      

      【讨论】:

        猜你喜欢
        • 2011-07-03
        • 1970-01-01
        • 2014-06-30
        • 2012-05-11
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 2018-01-03
        • 2021-11-15
        相关资源
        最近更新 更多