【问题标题】:Postgresql Update Values in a Column by Passing Arguments to A FunctionPostgresql 通过将参数传递给函数来更新列中的值
【发布时间】:2021-06-08 12:18:14
【问题描述】:

我有一个在 Windows 环境中运行的 Postgresql Server 11。我正在尝试根据调用另一个函数的返回数据来更新表列中的所有值。这是我到目前为止的进展:

UPDATE joa_clinics SET clinic_long = subquery.longitude
    FROM (SELECT longitude FROM  geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', '123 XYZ Street, Chicago IL 99999' ) ) as subquery; 

UPDATE joa_clinics SET clinic_long = subquery.longitude
    FROM (SELECT longitude FROM  geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', select from joa_clinics.ServiceAddress::text ) ) as subquery; 

所以表joa_clinics 有一个clinic_long 列,需要根据geocode_clinics_and_sales 函数调用的返回值进行更新;该函数返回 longitudelatitude 值。到目前为止,如果我传递一个硬编码的地址,我的顶级查询就可以工作。但地址应该是joa_clinics 表中ServiceAddress 的值,如底部查询所示。但是在那个查询中,我在第二个select 周围出现语法错误。帮助:joa_clinics 表中有一个 record_id 唯一列。

也许我走错了路?也许循环执行?我在 pgAdmin 中运行这些查询,但这无关紧要。现在,我可以手动运行它们——一个就完成了!

更新

我想我越来越近了,但所有值都相同,我需要在这个更新的查询中使用 WHERE 子句:

do
$$
declare
    f record;
begin
    for f in SELECT ServiceAddress FROM joa_clinics
    loop   
    raise notice '%', f.ServiceAddress;
    UPDATE joa_clinics SET clinic_long = subquery.longitude FROM
    (SELECT longitude FROM  geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', f.ServiceAddress )) as subquery; 
    
    end loop;
end;
$$

谢谢。

【问题讨论】:

  • 谢谢。我想我已经尝试了问题中函数的一些变体,但得到“用作表达式的子查询返回的不止一行”错误
  • 您可以通过将第二个查询包含在 () 中来使第二个查询“工作”。那么错误将是您返回多个值。要完成这项工作,需要某种循环来一次处理一个单独的地址。
  • 是的,我在发表原始评论后就知道了。
  • 是的,我想我现在正在研究使用光标;不想,但必须继续前进。谢谢。
  • 我会看看我是否可以使用光标:postgresqltutorial.com/plpgsql-cursor 谢谢

标签: postgresql sql-update subquery


【解决方案1】:

这就是我最终的做法。在一个循环中。不想,但存货足够长,不得不继续前进。以后可能会使其成为某些数据库“触发器”的一部分。

do
$$
declare
    f record;
begin
    for f in SELECT record_id, ServiceAddress FROM joa_clinics
    loop   
    raise notice '%', f.ServiceAddress;
    UPDATE joa_clinics SET clinic_long = subquery.longitude FROM
    (SELECT longitude FROM  geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', f.ServiceAddress )) as subquery where joa_clinics.record_id = f.record_id; 
    
    end loop;
end;
$$

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 2023-03-27
    • 2015-07-10
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多