我正在使用会话变量,我想创建一个执行以下操作的视图:
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
其中 X 和 Y 是不同的子句。
是否可以?
这可以通过常规选择语句(或者我需要存储过程)来实现吗?
我正在使用会话变量,我想创建一个执行以下操作的视图:
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
其中 X 和 Y 是不同的子句。
是否可以?
这可以通过常规选择语句(或者我需要存储过程)来实现吗?
尝试这样的事情:
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)
。
我通常使用存储过程或 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”列上放置索引并加快这种方法。
我建议使用存储过程,它使您的尝试更加清晰。