我在Postgres中有一个物化视图,如
CREATE MATERIALIZED VIEW my_view AS SELECT * FROM my_table WHERE my_column NOT IN ('a', 'b', 'c');
但('a', 'b', 'c')
是我的业务逻辑的一部分,我希望能够将其转换为('a', 'b', 'c', 'd')
或('a')
,而无需删除my_view
并重新创建它,因为它有一堆依赖的视图。所以我想将my_view
的定义替换为类似
CREATE MATERIALIZED VIEW my_view AS SELECT * FROM my_table WHERE my_column NOT IN my_unwanted_list();
然后my_unwanted_list
只返回一个常量,我可以通过更新my_unwanted_list
的定义来设置我想要的任何值。然后,我只需更新my_unwanted_list
并刷新my_view
即可添加不需要的值。
但是我在为my_unwanted_list
获取正确的语法时遇到了一些麻烦。如何编写PostgreSql函数,返回我可以在IN
过滤器中使用的内容?
答案 0 :(得分:1)
您可以将值放在array中,并使用ANY()
/ ALL()
构造与其元素进行比较:
CREATE FUNCTION my_unwanted_list() RETURNS TEXT[] AS $$
SELECT ARRAY['a', 'b', 'c']
$$ LANGUAGE sql IMMUTABLE;
CREATE MATERIALIZED VIEW my_view AS
SELECT * FROM my_table
WHERE my_column <> ALL(my_unwanted_list());
答案 1 :(得分:1)
如果您希望函数返回查询结果,或者您想使用IN
而不是<>ALL(array)
(如@NickBarnes建议的那样),您可以执行以下操作:
CREATE FUNCTION my_unwanted_list() RETURNS SETOF TEXT AS $$
SELECT col
FROM table
WHERE condition
$$ LANGUAGE sql IMMUTABLE;
CREATE MATERIALIZED VIEW my_view AS
SELECT * FROM my_table
WHERE my_column NOT IN (SELECT my_unwanted_list());