如何根据postgres中的列名更新列?

时间:2018-04-28 23:59:37

标签: postgresql massivejs

我已将其缩小为两种可能性 - DynamicSQL并使用案例陈述。

然而,我对这两个都失败了。

我根本不理解dynamicSQL,以及如何在我的情况下使用它。

这是我尝试使用案例陈述;许多失败的变种之一。

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?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

columnName

接下来,我们创建一个需要三个参数的函数:

columnValue - 需要更新的列的名称

employeeId - 列需要更新的新值

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; - 将更新的员工ID

通过使用format函数,我们将生成更新查询作为字符串,并使用EXECUTE命令执行查询。

这是函数的代码。

  INSERT INTO employees(column1, column2) VALUES ('column1_start_value','column2_start_value');

现在,我们将一些数据插入到employees表

id

现在,我们现在有一名column1值为1的员工,其中包含' column1_start_value' column2和' column2_start_value'的值column2的值。

如果我们想从< column2_start_value'更新SELECT * FROM update_columns_on_employee('column2','column2_new_value',1); 的值到' column2_new_value'我们所要做的就是执行以下调用

 SELECT id, TRIM('@' FROM REGEXP_SUBSTR(email, '@\S+', 1, LEVEL))
   FROM mytable
CONNECT BY REGEXP_SUBSTR(email, '@\S+', 1, LEVEL) IS NOT NULL
    -- If you have a composite key, mention all of the columns here:
    AND PRIOR id = id
    AND PRIOR SYS_GUID() IS NOT NULL;