如何使用PostgreSQL触发器从一个表列创建多个视图?

xxb16uws  于 2023-01-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(118)

我在PostgreSQL数据库工作。
我想使用一个循环从一个表列创建多个视图。
假设我有这个表mylist

id  type  
1   Fish
2   Bird
3   Fish
4   Fish
5   Bird

我使用该查询从type列中获取所有非重复值:

SELECT DISTINCT type from mylist;

它返回:

type
Fish
Bird

如何使用这两个值来自动创建以下视图(这里我只有两个值,但实际上可能会得到50多个不同的值):

  • mylist_鱼
  • 我的列表_bird

我知道应该使用触发器,但不知道如何根据查询返回的值创建视图。

0yg35tkg

0yg35tkg1#

诀窍在于动态地构建和运行所有的创建语句。
您可以在命令行中使用\gexec参数执行此操作。

SELECT
  FORMAT('CREATE OR REPLACE VIEW my_table_view_%s AS SELECT * FROM myList WHERE type = %L',type,type)
FROM (SELECT DISTINCT type FROM mylist) sub;\gexec

首先运行它,不要使用结尾的\gexec,看看会执行什么。使用您的示例,它将是:

CREATE OR REPLACE VIEW my_table_view_Fish AS SELECT * FROM myList WHERE type = 'Fish'
CREATE OR REPLACE VIEW my_table_view_Bird AS SELECT * FROM myList WHERE type = 'Bird'

如果你真的需要把它放在一个触发器或者函数里面(尽管我个人不会盲目地在每次表更新时创建或者重新创建视图),你可以使用execute,下面的例子使用了一个匿名的do块,你可以把它的内容移动到你的触发器中。

DO $$
BEGIN
  EXECUTE FORMAT('CREATE OR REPLACE VIEW my_table_view_%s AS SELECT * FROM myList WHERE type = %L',type,type)
  FROM (SELECT DISTINCT type FROM mylist) sub;
END $$;

相关问题