在运行时选择视图查询(postgres数据库)

时间:2014-11-19 13:27:18

标签: sql postgresql union sql-view

我想创建一个视图,它将根据运行时的会话变量(set_config)在两个可能的选择之间进行选择。
今天,我通过以下方式在两个选项之间通过“联合所有”来实现:

create view my_view as (
select * from X where cast(current_setting('first_select') as int)=1 and ...;
union all
select * from Y where cast(current_setting('first_select') as int)=0 and ...;
)

问题在于,当目标是联盟时,Postgres优化器会做出错误的决定。 所以,当我跑来跑去时:

select * from my_view where id in (select id from Z where field='value')

虽然它有一个“id”索引,但它决定对表X进行全面扫描 有没有另一种方法来定义这样的视图而不使用“union”子句?

1 个答案:

答案 0 :(得分:1)

OR 一起放入WHERE子句中。优化器将找到不变条件。

CREATE VIEW my_view AS (
SELECT * FROM X WHERE 
        ( cast(current_setting('first_select') as int)=1 AND <condition1> )
 OR     ( cast(current_setting('first_select') as int)=0 AND <condition2> )
        ...
        )
        ;