postgresql Postgres查询中的动态列名

cunj1qz1  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(164)

我有一张table,上面有一堆田地。为简单起见,假设5个字段:

unique_id, currency_name, stock_description, company_name, city_name

字符串
例如,样本值为:

INTQL123, USD,  "INT Stock", "International Stock Corporation", "CHICAGO"


另一个名为override_table的函数可以包含任意列的override值:

unique_id, override_column, override_value


样本值:

INTQL123, "city_name", "NEW YORK"


所以它是用新值“纽约”覆盖城市“芝加哥”的值
我希望能够用这样的动态列名编写SQL UPDATE语句。我们可以假设它们只属于varchar类型。你知道吗?

ig9co6j1

ig9co6j11#

Yoy可以通过匿名PL/pgSQL块和动态SQL来实现这一点。

do language plpgsql
$$
declare
  r record;
  DYNSQL constant text := 'UPDATE the_table SET %I = %L WHERE unique_id = %L';
begin
  for r in select * from override_table loop
    execute format(DYNSQL, r.override_column, r.override_value, r.unique_id);
  end loop;
end;
$$;

字符串
上面的代码是SQLi倾向的。在运行表override_table之前,请确保表override_table中不存在恶意值。

编辑

“有没有办法把更新的次数返回给调用者?“
匿名do块不返回任何内容。我想到了两种方法。

  • 您可以将上面的代码塑造成一个带有计数器的函数,比如dyn_update,并从Java发出select dyn_update();
CREATE OR REPLACE FUNCTION dyn_update()
returns integer language plpgsql as
$$
declare
  r record;
  DYNSQL constant text := 'UPDATE the_table SET %I = %L WHERE unique_id = %L';
  retval integer := 0;
begin
  for r in select * from override_table loop
    execute format(DYNSQL, r.override_column, r.override_value, r.unique_id);
    retval := retval + 1;
  end loop;
  return retval;
end;
$$;

  • select count(*) from override_table,因为它将准确地返回更新的数量(除非do块发生异常)

相关问题