Postgresql 根据条件从不同的表中选择
我想根据一个参数从不同的表中进行选择,可以这样做吗?两个表都具有兼容的结构Postgresql 根据条件从不同的表中选择,postgresql,plpgsql,Postgresql,Plpgsql,我想根据一个参数从不同的表中进行选择,可以这样做吗?两个表都具有兼容的结构 select * from ( case when p_target then select * from table_a else select * from table_b end ); 虽然这根本不是最佳实践,而且您应该真正了解您的数据模型,但有一种方法可以做到这一点: with table_a as ( select 1::int, 'a'::text p
select * from
(
case when p_target then
select * from table_a
else
select * from table_b
end
);
虽然这根本不是最佳实践,而且您应该真正了解您的数据模型,但有一种方法可以做到这一点:
with table_a as (
select 1::int, 'a'::text param
), table_b as (
select 2::int, 'b'::text param
)
select *
from (
select *
from table_a
union all
select *
from table_b
) rs
where param = 'a'
只需向所有表添加一个参数列,合并它们,然后将它们全部放在子查询中,您可以从子查询中选择特定表的参数。虽然这根本不是最佳做法,您应该仔细查看您的数据模型,但有一种方法可以做到这一点:
with table_a as (
select 1::int, 'a'::text param
), table_b as (
select 2::int, 'b'::text param
)
select *
from (
select *
from table_a
union all
select *
from table_b
) rs
where param = 'a'
只需向所有表中添加一个参数列,并将它们合并,然后将它们全部放在子查询中,您可以从中选择特定表的参数。Georgi的答案最好地解决了我提出的问题,因此对于未来的读者来说,这可能是正确的答案 但是,对于我的情况,我采取了不同的方法,将表交换功能封装到一个过程中,该过程如下所示:
create function table_swap(p_target character varying)
returns TABLE(id int)
language plpgsql
as $$
begin
case
when p_target = 'a' then
return query
select * from table_a;
when p_target = 'b' then
return query
select * from table_b;
else
return;
end case;
这让我可以做下面的事情
select * from table_swap(p_target);
格奥尔基的回答最好地解决了我提出的问题,所以对于未来的读者来说,这可能是正确的答案 但是,对于我的情况,我采取了不同的方法,将表交换功能封装到一个过程中,该过程如下所示:
create function table_swap(p_target character varying)
returns TABLE(id int)
language plpgsql
as $$
begin
case
when p_target = 'a' then
return query
select * from table_a;
when p_target = 'b' then
return query
select * from table_b;
else
return;
end case;
这让我可以做下面的事情
select * from table_swap(p_target);
这听起来像是一个非常糟糕的数据模型。您应该有一个带有列
target
(或类似内容)的表,然后您可以简单地从表中执行选择*,其中target=p\u target
@a\u horse\u,带有\u no\u名称它不是真正的数据模型,实际上是生成序列的许多不同方式,也就是说,从0到59每分钟一次,或者每x天或每x周一次遍历2个日期范围,等等。对于生成的系列,我加入我的报告数据,这会产生用户所需的聚合+单位。这听起来像是一个非常糟糕的数据模型。您应该有一个带有列target
(或类似内容)的表,然后您可以简单地从表中执行选择*,其中target=p\u target
@a\u horse\u,带有\u no\u名称它不是真正的数据模型,实际上是生成序列的许多不同方式,也就是说,每分钟0到59次,或每x天或周等一次通过2个日期范围。对于生成的系列,我加入我的报告数据,从而得到用户所需的聚合+单位。