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个日期范围。对于生成的系列,我加入我的报告数据,从而得到用户所需的聚合+单位。