如何创建一个SQL函数,该函数根据条件返回带有额外列的表,该列中填充了值?

时间:2020-03-30 14:16:03

标签: postgresql function postgresql-9.5 create-function

我有一个“ code_table”,其中包含成对的整数整数( code )和唯一文本( name )。我有几个表,其中有代码,但没有名称。我想创建一个函数,该函数返回要更改的表,但它还会添加一个列,该列的名称代码相匹配。我可以一一处理,但是我需要一个带有参数的函数作为表名。

例如,这是 code_table

code     name
(int)    (text)
1    ;  "Blue"
2    ;  "Yellow"
3    ;  "Red"
4    ;  "Green"
5    ;  "Purple"
6    ;  "Black"
7    ;  "White"
8    ;  "Gray"

我还有一个示例表- table1

id  something  code
(int) (text) (int)
1 ; "someinfo" ; 4
2 ; "someinfo" ; 2
3 ; "someinfo" ; 6
4 ; "someinfo" ; 1
5 ; "someinfo" ; 8
6 ; "someinfo" ; 4
7 ; "someinfo" ; 2
8 ; "someinfo" ; 2
9 ; "someinfo" ; 3

我创建了一个没有返回值的函数,但是它满足了我的期望:

CREATE FUNCTION add_code_name() 
RETURNS VOID AS
$BODY$
BEGIN
    ALTER TABLE table1 ADD name text;
    EXECUTE 'UPDATE table1 SET name = code_table.name FROM code_table WHERE table1.code = code_table.code';
END;
$BODY$
LANGUAGE plpgsql;

结果我得到了:

id  something  code name
(int) (text) (int) (text)
1 ; "someinfo" ; 4 ; "Green"
2 ; "someinfo" ; 2 ; "Yellow"
3 ; "someinfo" ; 6 ; "Black"
4 ; "someinfo" ; 1 ; "Blue"
5 ; "someinfo" ; 8 ; "Gray"
6 ; "someinfo" ; 4 ; "Green"
7 ; "someinfo" ; 2 ; "Yellow"
8 ; "someinfo" ; 2 ; "Yellow"
9 ; "someinfo" ; 3 ; "Red"

我的问题:是否可以通过某种方式将表的名称放入functions参数中,因此对我的任何表都可以这样做?我还要在其中输入包含 code 的列的名称,例如:

add_code_name(table1.code) 

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这是执行更改和更新的功能:

create or replace function add_code_name(rel text, code_col text)
returns void as 
$Body$
begin
    execute 'ALTER TABLE '||quote_ident(rel)||' ADD name text';
    execute 'UPDATE '||quote_ident(rel)||' SET name = code_table.name FROM code_table WHERE '||quote_ident(rel)||'.'||quote_ident(code_col)||' = code_table.code';

    return;
end;
$Body$
language plpgsql; 

您运行它:

select add_code_name('table1', 'code');