在PostgreSQL中通过会话变量动态选择视图选择语句

时间:2012-12-05 06:35:25

标签: sql postgresql

我正在处理会话变量,我想创建一个执行以下操作的视图:

if (myVar=1)
  select * from my_table where X
else
  select * from my_table where Y

其中X和Y是不同的条款。

有可能吗?

这可以用常规select语句实现(或者我需要存储过程)吗?

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

SELECT 'A'
FROM tableA
WHERE current_setting(setting_name) = 'setting A'
UNION ALL
SELECT 'B'
FROM tableB
WHERE current_setting(setting_name) = 'setting B'

有关postgresql会话变量的详细信息here

UPD它将给出其中一个SELECT的结果。如果current_setting(setting_name)等于'setting A',则第一个查询将返回结果,但第二个查询将返回结果。

对于您的示例,查询将如下所示:

SELECT 'A'
FROM tableA
WHERE myVar = 1
UNION ALL
SELECT 'B'
FROM tableB
WHERE myVar != 1

UPD已检查:postgres仅执行其中一个查询。 EXPLAIN ANALYZE表示第二个查询已计划好,但标记为(never executes)

答案 1 :(得分:0)

我通常使用存储过程或UDF(如果您的RDBMS支持它们)。由于无法将参数传递给视图,因此视图不适合。但是,你可以通过创建像这样的视图来实现这样的目标

create view MyView as
select 1 as MyVar, * from A
union
select 2 as MyVar, * from B

并过滤应用程序中的MyVar列

select * from MyView where MyVar = :MyVar

但是,这通常涉及整个视图的表扫描。同样,根据RDBMS,您可以在“MyVar”列上放置一个索引并加快这种方法。

我建议使用存储过程,这会使您的尝试更加清晰。