我可以从Postgres函数返回一个字符串列表吗?

时间:2016-05-24 01:35:56

标签: postgresql

我在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过滤器中使用的内容?

2 个答案:

答案 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());