如何创建一个 SQL 函数,使 returns table 具有额外的列,并根据条件填充值?
How to create an SQL function that returns the table with an extra column, filled with values, based on a condition?
我有一个 "code_table" 包含成对的唯一整数 (code) 和唯一文本 (name)。我有几个 tables,其中我有 codes,但没有 names。我想创建一个 return 是我打算更改的 table 的函数,但它还会添加一个具有 names 匹配的列代码。我可以一个一个地处理这个问题,但是我需要一个带有 table.
名称参数的函数
例如,这里有一个 code_table:
code name
(int) (text)
1 ; "Blue"
2 ; "Yellow"
3 ; "Red"
4 ; "Green"
5 ; "Purple"
6 ; "Black"
7 ; "White"
8 ; "Gray"
我也有例子table - 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
我创建了一个没有 return 值的函数,但它满足了我的要求:
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"
我的问题: 有没有办法以某种方式将 table 的名称放入函数参数中,这样它对我的任何 tables?另外我会把包含 code 的列的名称放在那里像这样:
add_code_name(table1.code)
感谢您的帮助!
这是一个执行更改和更新的函数:
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');
我有一个 "code_table" 包含成对的唯一整数 (code) 和唯一文本 (name)。我有几个 tables,其中我有 codes,但没有 names。我想创建一个 return 是我打算更改的 table 的函数,但它还会添加一个具有 names 匹配的列代码。我可以一个一个地处理这个问题,但是我需要一个带有 table.
名称参数的函数例如,这里有一个 code_table:
code name
(int) (text)
1 ; "Blue"
2 ; "Yellow"
3 ; "Red"
4 ; "Green"
5 ; "Purple"
6 ; "Black"
7 ; "White"
8 ; "Gray"
我也有例子table - 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
我创建了一个没有 return 值的函数,但它满足了我的要求:
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"
我的问题: 有没有办法以某种方式将 table 的名称放入函数参数中,这样它对我的任何 tables?另外我会把包含 code 的列的名称放在那里像这样:
add_code_name(table1.code)
感谢您的帮助!
这是一个执行更改和更新的函数:
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');