在 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,具体取决于您的用例的未公开细节...
这样的事情可能吗?
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,具体取决于您的用例的未公开细节...