sql - 如何在不使用 CASE WHEN 的情况下将 GROUP BY 作为参数?

标签 sql postgresql case plpgsql dynamic-sql

我有下表,其中包含以下表格、值和类型。

create table example  (
fname text,
lname text,
value int);

insert into example values
('doge','coin',123),
('bit','coin',434),
('lite','coin',565),
('doge','meme',183),
('bit','meme',453),
('lite','meme',433);

create type resultrow as (
nam text,
amount int);

我想编写一个函数,该函数按我提供给该函数的参数进行分组。 这个例子有效:

do $$
declare
 my_parameter text;
 results resultrow[];
begin

my_parameter = 'last';

results := array(select row( case when my_parameter = 'first' then fname
            when my_parameter = 'last' then lname
       end,
       sum(salary))::resultrow
  from example
  group by case when my_parameter = 'first' then fname
            when my_parameter = 'last' then lname
       end);

raise notice '%', results;
end;
$$ language plpgsql;

有人告诉我,CASE WHEN 决策的成本确实很高。一种明显的解决方案是创建两次选择语句:

if my_parameter = 'first' then
  results := array(select row(fname,sum(salary))::resultrow
  from example
  group by fname);
end if;

if my_parameter = 'last' then
  results := array(select row(lname,sum(salary))::resultrow
  from example
  group by lname);
end if;

但这会导致大量难看的重复代码。

还有其他解决方案可以使分组参数化吗?

最佳答案

如果你不想使用case,你可以使用这个:

with cte(name, salary) as (
    select fname, salary from example where my_parameter = 'first'
    union all
    select lname, salary from example where my_parameter = 'last'
) 
select name, sum(salary)
from cte
group by name

但是,实际上,最好测试一下,我没有听说case很贵。

如果你发现case并不昂贵,我仍然建议使用子查询或cte来避免代码重复,例如:

with cte(name, salary) as (
    select
        case
            when my_parameter = 'first' then fname
            when my_parameter = 'last' then lname
        end as name,
        salary
    from example
) 
select name, sum(salary)
from cte
group by name

关于sql - 如何在不使用 CASE WHEN 的情况下将 GROUP BY 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23492003/

相关文章:

sql - 我怎样才能重写这些子查询

Hibernate 在 case when 语句内进行子查询

mysql - mysql 和 oracle sql 方言之间的主要区别是什么?

java - JOOQ 从大表 : good practise 取数据

sql - 如何在 Visual Studio 中的 Sql Server Data Tools Editor 中更改连接

postgresql - Postgres : difference between two timestamps (hours:minutes:seconds)

mysql - SQL执行时的Case表达式

sql - 当 ColumnName 为变量时按大小写排序

mysql - 创建一个新的提取字符串 sql 列

php - 查询两个表的电子邮件地址,每个只列出一次