postgresql - 在 postgres 过程中组合 2 个变量
问题描述
我有 3 个表:post、tag 和 tag_post
post 保存实际的帖子,tags 保存到目前为止已创建的标签,而 tag_post 保存它们之间的关系。创建新帖子时,会发生 4 件事:
创建所有尚不存在的标签
帖子已创建
创建所有 tag_post 关系
新创建的帖子返回给函数调用者
这些是桌子
/*
POST TABLES
*/
CREATE TABLE tag(
name text PRIMARY KEY,
check(name!='')
);
CREATE TABLE post(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
title text,
url text,
author text NOT NULL references profile(name)
);
CREATE TABLE tag_post(
tag text REFERENCES tag(name),
post uuid REFERENCES post(id),
UNIQUE (tag, post)
);
以下是我的做法:
/*
CREATE A NEW POST
*/
create or replace function create_post(
author text,
title text,
url text,
tags text[]
)
RETURNS post
as $$
DECLARE
inserted record;
begin
INSERT INTO tag(name)
SELECT v
FROM unnest(tags) g(v)
ON CONFLICT DO NOTHING;
INSERT INTO post(author, title, url)
values(author,title,url)
RETURNING * INTO inserted;
INSERT INTO tag_post(tag,post)
SELECT g.v, inserted.id FROM
unnest(tags) g(v);
RETURN inserted;
END $$
language plpgsql;
现在我还想返回传递给函数的标签数组以及插入的行。基本上是这样的(这不起作用,只是为了演示):
SELECT inserted.*, tags as tags FROM inserted join tags INTO inserted;
但我不知道如何将 2 个变量组合成一个变量。有没有办法做到这一点?
解决方案
下面是我是如何做到的:
SELECT row_to_json(sel)
FROM
(
SELECT inserted.*,tags
) sel
INTO inserted2;
RETURN inserted2;
insert2 是一个 json 变量
推荐阅读
- regex - 请问如何在mariadb的过程中使用正则表达式?
- ffmpeg - 如何为 h264_omx 编码器指定 ffmpeg 配置文件?
- android - 无法解析 R [无 admob]
- oracle-adf - MDS-00013:找不到元数据对象“/WEB-INF/Foo.xml”的元数据
- c - 使用信号量的生产者和消费者中的分段错误(核心转储)
- c# - 根据输入动态生成子类
- c# - 将 32 位颜色数据数组转换为 8 位等效值
- javascript - 你如何返回一个模板/html页面,该页面上的函数承诺返回一个值
- objective-c - 如何获取 Mac OS 网络配置
- html - 如何开发移动响应式邮件程序