0

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

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

其中 X 和 Y 是不同的子句。

是否可以?

这可以通过常规选择语句(或者我需要存储过程)来实现吗?

4

2 回答 2

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 会话变量的详细信息。

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 Checked:postgres 只执行其中一个查询。EXPLAIN ANALYZE显示第二个查询已计划但标记为(never executes)

于 2012-12-05T09:04:18.633 回答
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”列上放置索引并加快这种方法。

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

于 2012-12-05T06:47:56.597 回答