首页 > 解决方案 > 在 postgres 过程中组合 2 个变量

问题描述

我有 3 个表:post、tag 和 tag_post

post 保存实际的帖子,tags 保存到目前为止已创建的标签,而 tag_post 保存它们之间的关系。创建新帖子时,会发生 4 件事:

这些是桌子

/*
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 个变量组合成一个变量。有没有办法做到这一点?

标签: postgresql

解决方案


下面是我是如何做到的:

SELECT row_to_json(sel)
FROM
(
    SELECT inserted.*,tags
) sel
INTO inserted2;

RETURN inserted2;

insert2 是一个 json 变量


推荐阅读