首页 > 解决方案 > 使用更新 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...

标签: postgresqlsql-updatesubquery

解决方案


显然,您正试图从另一个表中的列派生要更新的列名。但是,解析 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;
$$; 

注意:在没有表格定义和测试数据的情况下,上述内容未经测试。我也不会隔离它。它作为示例提供。


推荐阅读