postgresql - 使用更新 pgsql 集中的选择
问题描述
您好,我想知道为什么我不能在我的 UPDATE 集中使用 SELECT,如下所示:
UPDATE "WU_Users" SET (SELECT "colonnesName" FROM colonnes WHERE "id" = i) = '0/0' WHERE "IDWU_Users" = (SELECT "idUser" FROM query WHERE "id" = i);
我收到此错误:
erreur de syntaxe sur ou près de « SELECT »
LIGNE 22 : UPDATE "WU_Users" SET (SELECT "colonnesName" FRO...
解决方案
显然,您正试图从另一个表中的列派生要更新的列名。但是,解析 SQL 语句需要在解析语句之前修复结构组件(表名、列名、视图名……)。您正在尝试的内容需要在解析语句中解析语句的一部分。目前,这不会发生。要完成您正在尝试的操作,需要动态 SQL 以便在运行时生成 UPDATE 语句。就像是:
create or replace
procedure update_wu_users_from_idwu_users(i integer) -- assumes i as parameter as it is not defined
language plpgsql
as $$
declare
k_update_stmt constant text =
$stmt$ update wu_users set %I = '0/0'
where wu_users =
(select iduser
from query -- assumes query is a table, view, or materalized view
where id = i
)
$stmt$;
l_update_column text;
l_update_stmt text;
begin
select colonnesname
into l_update_column
from columns
where id = i;
if not found then
raise exception 'No column name found on table colonnes for id=%',i;
end if;
l_update_stmt = format(k_update_stmt,k_update_stmt);
raise notice '%', l_update_stmt; -- for debigging for prod raise_log might be better
execute l_update_stmt;
end;
$$;
注意:在没有表格定义和测试数据的情况下,上述内容未经测试。我也不会隔离它。它作为示例提供。
推荐阅读
- javascript - 通过节点 API 将值从 html 表单传递到另一个(重定向页面)
- angular - 路由时超时。Angular 9 通用 + Firebase
- swiftui - CKShare 和 SwiftUI
- swift - SWIFTUI List 希望在列表中有切换。无法将“MyModel”类型的值转换为预期的参数类型“Binding”
' - oracle - PL/SQL 触发器未按预期评估 IF 条件
- javascript - 如何使用 word-wrap: break-word 计算行数?
- python-3.x - 绑定到输入框并更改输入
- python - 循环中跳过错误 - JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
- javascript - 无法在 JavaScript 中将对象转换为字符串
- python - Python PIL 裁剪图像并将裁剪保存为新图像/副本