【问题标题】:Using a select in the set of an update pgsql使用更新 pgsql 集中的选择
【发布时间】:2021-06-02 14:44:50
【问题描述】:

您好,我想知道为什么我不能像这样在我的 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...

【问题讨论】:

  • 我不知道你想做什么。我建议您查看UPDATE 此处的示例部分,看看有什么可能。
  • 我正在尝试在 SET 语句中使用 SELECT。
  • 你不能。看看你能做什么的例子。

标签: postgresql sql-update subquery


【解决方案1】:

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

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

【讨论】:

  • 我认为你不明白我想要什么。我不是在问这个。只是要求用 SELECT 替换“SET”语句。如果我指定列名,我已经知道该怎么做。在这里,我试图从 TEMP 表中检索列名
  • 我完全理解。您想要的是,从临时表中获取列名,然后在 Update 语句中使用检索到的列,这正是该函数所做的。当列名不在运行时之前,您根本不能在 SQL 或 PLPGSQL 中使用 set = (select column_name...)。唯一额外的“东西”是我如何定义长字符串(在执行部分讨厌它们)和最小数据验证
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2019-01-11
相关资源
最近更新 更多