我有下表,其中包含以下表格、值和类型。
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/