检测for循环中的最后一条记录

Posted

技术标签:

【中文标题】检测for循环中的最后一条记录【英文标题】:Detecting the last record in a for loop 【发布时间】:2018-08-13 08:13:44 【问题描述】:

我有一系列循环,它们以奇怪的伪 json 格式将数据表中的一个 clob 放在一起。

我遇到的问题是这些循环中的每一个都需要以相关字符结束部分,但我无法弄清楚如何识别最后一条记录。

到目前为止,我有:

for y in (select distinct ident from table(an_object))
loop
  pseudojson := pseudojson || '';

  the_row := y.ident;
  for z in (select * from table(an_object) where ident = the_row)
    loop
    pseudojson := pseudojson || z.the_key ||': "' || z.the_value ||'"';
    -- (1)
    end loop;

  pseudojson := pseudojson || '';
  -- (2)
end loop;

pseudojson := pseudojson || '';

an_object 包含未透视的数据,按ident 分组到前面的行中。

出于逻辑,我试图在以下内容中硬塞

(1)

if not z.last 
then 
  pseudojson := pseudojson || ','; 
end if;

和(2)

if not y.last
then 
  pseudojson := pseudojson || ','; 
end if;

但这些运算符在 for 循环中不起作用。

谁能指引我正确的方向?

【问题讨论】:

如果是最后一条记录怎么办。它应该是什么样子 @XING 如果是最后一个,什么都不做,退出循环。 【参考方案1】:

你可以这样做。你需要一个布尔变量:

first := true;

循环内部:

if not first then
    pseudojson := pseudojson || ','; 
end if;
first := false;
-- Add the element
...

【讨论】:

【参考方案2】:

怎么样:做任何事情,在循环中连接常用个字符,包括“最后”行。

退出循环后,RTRIM 是多余的字符(逗号,对吗?)。像这样的:

for y in (select distinct ident from table(an_object))
loop
  pseudojson := pseudojson || '';

  the_row := y.ident;
  for z in (select * from table(an_object) where ident = the_row)
    loop
    pseudojson := pseudojson || z.the_key ||': "' || z.the_value ||'"';
    -- (1)
    pseudojson := pseudojson ||',';
    end loop;

    pseudojson := rtrim(pseudojson, ',');  --> this

  pseudojson := pseudojson || '';
  -- (2)
  pseudojson := pseudojson ||',';
end loop;

pseudojson := rtrim(pseudojson, ',');      --> this
pseudojson := pseudojson || '';

【讨论】:

以上是关于检测for循环中的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 std::map 循环中的最后一次迭代?

django 打印 cmd 中的所有记录,但在模板上显示最后一条

SQL游标怎么循环更新

Swift 中的核心数据:仅在 for 循环中保存最后一个对象

使用for语句循环遍历数组

JavaScript基础 if 循环 for 循环