【问题标题】:How to update column based on column name in postgres?如何根据postgres中的列名更新列?
【发布时间】:2018-10-09 11:07:41
【问题描述】:

我已将其缩小到两种可能性 - 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?

提前致谢。

【问题讨论】:

    标签: postgresql massivejs


    【解决方案1】:

    我将向您展示一种使用函数的方法。 首先我们创建员工表:

    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;
    

    现在,让我们在员工表中插入一些数据

      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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2020-02-19
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      相关资源
      最近更新 更多