【问题标题】:plpgsql loop through query and updateplpgsql 循环查询和更新
【发布时间】:2018-04-12 17:23:06
【问题描述】:

我有一个名为test 的表,我按名为daterange 的范围的上限对其进行排序。我想把这些排序数据的顺序保存在同一个表的另一列中,名为bc_order

排序顺序必须保存在bc_order列中。

所以我订购了我想要的数据,循环遍历结果并每次增加一个计数器,然后用当前计数器更新bc_order 列。

CREATE OR REPLACE FUNCTION __a_bc_order() RETURNS void  AS $$
    DECLARE
        iterator integer := 1;
        r  test%rowtype;
    BEGIN
        for r in 
        select * from test where upper(test.daterange)<0 order by upper(test.daterange) DESC
        loop     
            update test SET bc_order  = iterator where test.id = test.id ;    
            iterator := iterator + 1;
        end loop ;
    END
$$ LANGUAGE plpgsql;

select __a_bc_order();

我希望能得到类似的东西

id        daterange     bc_order
14  [-3001011,-2000101) 1
21  [-3001202,-3000102) 2
19  [-3010102,-3000102) 3
22  [-4001202,-4000102) 4
23  [-4000702,-4000302) 5
27  [-6000401,-6000201) 6
26  [-6000501,-6000301) 7

但我明白了

id        daterange     bc_order
14  [-3001011,-2000101) 7
21  [-3001202,-3000102) 7
19  [-3010102,-3000102) 7
22  [-4001202,-4000102) 7
23  [-4000702,-4000302) 7
27  [-6000401,-6000201) 7
26  [-6000501,-6000301) 7

我猜我无法修复循环问题。请指教。我使用 PostgreSQL 10

【问题讨论】:

    标签: postgresql loops sorting sql-update plpgsql


    【解决方案1】:

    无需使用循环或 PL/pgSQL:

    update test
      set bc_order = t.rn
    from (
      select id, row_number() over (order by upper(daterange) desc) as rn
      from test
      upper(daterange) < 0 
    ) t
    where t.id = test.id;
    

    【讨论】:

      【解决方案2】:

      你的代码错了。

      update test SET bc_order  = iterator where test.id = test.id ; 
      

      确实有效

      update test SET bc_order  = iterator where true; 
      

      这正是你的结果。

      应该是

      update test SET bc_order  = iterator where test.id = r.id; 
      

      @a_horse_with_no_name 很有帮助 - 一条可读的 SQL 语句所能做到的,应该由一条 SQL 查询来完成。

      【讨论】:

        猜你喜欢
        • 2021-05-06
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        相关资源
        最近更新 更多