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