如何根据postgres中的列名更新列?
How to update column based on column name in postgres?
我已将其缩小为两种可能性 - 动态SQL 和使用 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 =
where employee_id = ;
再一次,我要传递给那些使用大量的人。
我收到错误 { error: syntax error at or near "'address'"}
因为我的传入值是字符串。我的思考过程是上面的语句允许我使用变量,因为 'address'
被引号括起来。
但是,唉,我的思维过程失败了。
这似乎接近于回答我的问题,但我似乎无法弄清楚如果使用动态 SQL 在我的情况下该怎么做。
提前致谢。
我将向您展示一种使用函数来完成此操作的方法。
首先我们创建员工 table :
CREATE TABLE employees(
id BIGSERIAL PRIMARY KEY,
column1 TEXT,
column2 TEXT
);
接下来,我们创建一个需要三个参数的函数:
columnName
- 需要更新的列名
columnValue
- 列需要更新的新值
employeeId
- 将要更新的员工 ID
通过使用格式函数,我们将更新查询生成为字符串,并使用 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;
现在,让我们向员工中插入一些数据table
INSERT INTO employees(column1, column2) VALUES ('column1_start_value','column2_start_value');
所以现在我们有一个 id
值为 1 的员工,他 column1
的值为 'column1_start_value',[=19= 的值为 'column2_start_value' ].
如果我们想将column2
的值从'column2_start_value'更新为'column2_new_value'我们所要做的就是执行下面的调用
SELECT * FROM update_columns_on_employee('column2','column2_new_value',1);
我已将其缩小为两种可能性 - 动态SQL 和使用 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 =
where employee_id = ;
再一次,我要传递给那些使用大量的人。
我收到错误 { error: syntax error at or near "'address'"}
因为我的传入值是字符串。我的思考过程是上面的语句允许我使用变量,因为 'address'
被引号括起来。
但是,唉,我的思维过程失败了。
这似乎接近于回答我的问题,但我似乎无法弄清楚如果使用动态 SQL 在我的情况下该怎么做。
提前致谢。
我将向您展示一种使用函数来完成此操作的方法。 首先我们创建员工 table :
CREATE TABLE employees(
id BIGSERIAL PRIMARY KEY,
column1 TEXT,
column2 TEXT
);
接下来,我们创建一个需要三个参数的函数:
columnName
- 需要更新的列名
columnValue
- 列需要更新的新值
employeeId
- 将要更新的员工 ID
通过使用格式函数,我们将更新查询生成为字符串,并使用 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;
现在,让我们向员工中插入一些数据table
INSERT INTO employees(column1, column2) VALUES ('column1_start_value','column2_start_value');
所以现在我们有一个 id
值为 1 的员工,他 column1
的值为 'column1_start_value',[=19= 的值为 'column2_start_value' ].
如果我们想将column2
的值从'column2_start_value'更新为'column2_new_value'我们所要做的就是执行下面的调用
SELECT * FROM update_columns_on_employee('column2','column2_new_value',1);