我把它缩小到两种可能性 - DynamicSQL并使用case语句。
但是,我对这两个都失败了。
我根本不懂动态SQL,以及如何在我的情况下使用它。
这是我尝试使用案例陈述;许多失败的变化之一。
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?
提前致谢。
我将通过使用函数向您展示一种方法。首先我们创建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);