我将范围缩小到两种可能性-- DynamicSQL和使用case语句。
然而,这两件事我都失败了。
我只是不明白dynamicSQL,以及如何在我的情况下使用它。
这是我使用case语句的尝试;许多失败的变体之一。
SELECT column_name,
CASE WHEN column_name = 'address' THEN (**update statement gives syntax error within here**)
END
FROM information_schema.columns
WHERE table_name = 'employees';作为一个概述,我使用Axios与我的Node服务器对话,该服务器使用Massivejs.调用我的Heroku数据库。
也许这不是我们该走的路--我的主要问题是:
我遇到了麻烦,因为我计划将作为列名使用的值作为字符串发送到我的服务器。我一直试图用的电话是
update employees
set $1 = $2
where employee_id = $3;再一次,我要进入那些使用巨大的。
我得到错误{ error: syntax error at or near "'address'"},因为我的传入值是字符串。我的想法是,上面的语句将允许我使用变量,因为'address'是由引号封装的。
但是,唉,我的思维过程让我失望了。
这似乎接近于回答我的问题,但如果使用动态SQL,我似乎想不出在我的情况下该做什么。
How to use dynamic column names in an UPDATE or SELECT statement in a function?
提前谢谢。
发布于 2018-04-29 00:46:44
我将向您展示一种通过使用函数来完成此操作的方法。首先,我们创建employees表:
CREATE TABLE employees(
id BIGSERIAL PRIMARY KEY,
column1 TEXT,
column2 TEXT
);接下来,我们创建一个需要三个参数的函数:
columnName -需要更新的列的名称
columnValue -需要将列更新到的新值
employeeId -将更新的雇员的id
通过使用format函数,我们将更新查询作为字符串生成,并使用EXECUTE命令执行查询。
这是函数的代码。
CREATE OR REPLACE FUNCTION update_columns_on_employee(columnName TEXT, columnValue TEXT, employeeId BIGINT)
RETURNS VOID AS
$$
DECLARE update_statement TEXT := format('UPDATE EMPLOYEES SET %s = ''%s'' WHERE id = %L',columnName, columnValue, employeeId);
BEGIN
EXECUTE update_statement;
end;
$$ LANGUAGE plpgsql;现在,让我们在employees表中插入一些数据。
INSERT INTO employees(column1, column2) VALUES ('column1_start_value','column2_start_value');现在我们有一个id值为1的雇员,他的column1值为'column1_start_value‘值,column2为'column2_start_value’值。
如果要将column2的值从“column2_start_value”更新为“column2_new_value”,只需执行以下调用
SELECT * FROM update_columns_on_employee('column2','column2_new_value',1);https://stackoverflow.com/questions/50082128
复制相似问题