gpt4 book ai didi

postgresql - 动态访问记录中的列值

转载 作者:行者123 更新时间:2023-11-29 12:19:49 25 4
gpt4 key购买 nike

是否可以通过名称动态访问记录中的列值?

我正在编写一个执行动态 SQL 命令的触发器函数,我想按列名从 NEW 记录中动态提取列值。

这是我正在尝试做的一个简化示例:

$$
DECLARE
command text := 'UPDATE $1 SET $2 = $3';
myColumn := 'votes'
BEGIN
EXECUTE command using 'anotherTable', myColumn, NEW.myColumn;
END
$$

最佳答案

可能,但是EXECUTEUSING子句只能传递,而表名和列名等标识符必须在命令字符串中连接起来。 (小心 SQL 注入(inject)!)使用 format()它可以像这样工作:

CREATE FUNCTION ... AS
$func$
DECLARE
_command text := 'UPDATE %I SET %I = $1 WHERE ....'; -- add WHERE condition
_col text := 'votes';
BEGIN
EXECUTE format(_command, 'anotherTable', _col)
USING NEW.myColumn;
END
$func$;

修复了传递过程中的一些小问题。

必须提到的是,NEW 仅在触发器函数中可用。

请注意,'anotherTable' 在这里区分大小写(与字符串中的双引号安全连接em>),而 NEW.myColumn 不是(作为未加引号的标识符处理)。在 Postgres 中始终使用合法的、小写的、不带引号的标识符,以使您的生活更轻松。

具有更多解释和链接的相关答案:


To dynamically extract a column value from a NEW record by column name.

...您可以使用 hstore #= operator :

或者您也可以使其与动态 SQL 的标准功能一起使用:

CREATE FUNCTION ... AS$func$DECLARE   _col text := 'votes';   _new_col text := 'column_name_in_new';  -- case-sensitive column name hereBEGIN   EXECUTE format(       'UPDATE %I SET %I = $1.%I WHERE ... '  -- add WHERE condition     , 'anotherTable', _col, _new_col)   USING  NEW;  -- pass whole rowEND$func$;

相关:

关于postgresql - 动态访问记录中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com