在 PL/pgSQL 中循环遍历结果集时检查该行是否为最后一行

Check if the row is the last one when looping through result set in PL/pgSQL

这样的事情可能吗?

FOR row_var IN SELECT * FROM my_table LOOP
    -- ...
    IF is_last_row THEN
        -- do something...
    END IF;
END LOOP

我现在唯一想到的就是 select 计算行数并将其与循环中的 row_number() 进行比较。

您不需要 count() 的新变量或附加查询。 如果我们假设您在 table my_table 中的 id 列中有主键,您可以使用 WINDOW FUNCTION:

添加一列
FOR row_var IN SELECT lead(id) OVER() IS NULL AS is_last_row, * FROM my_table LOOP
-- ...
    IF row_var.is_last_row THEN
        -- do something...
    END IF;
END LOOP

如果您有复合 PK 或根本没有 PK table,您可以使用:

SELECT lead(r) OVER()  IS NULL AS is_last_row, *
FROM (
    SELECT 1 as r, * FROM ruch.s_icd10
) sub

as LOOP 查询。这是我唯一的想法。

如果您选择按唯一键排序的行,查询 last_id 应该比使用 row_number() 查询 count() 便宜,例如:

last_id := (select id from test order by id desc);
for rec in 
    select * from test order by id
loop
    if rec.id = last_id then
    ...

有一个非常便宜和简单的方法。循环结束后,您的行变量 row_var 仍保留最后一行。那就用吧:

FOR row_var IN
   SELECT * FROM my_table ORDER BY ???
LOOP
    -- do something for every row here
END LOOP;

-- do something with row_var for the last row here

除此之外,通常有一个更有效的解决方案 SQL,具体取决于您的用例的未公开细节...