我有一系列循环,以奇怪的伪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循环中不起作用。
任何人都可以指引我正确的方向吗?
答案 0 :(得分:4)
这是怎么回事:做什么,将循环中的常用字符连接起来,包括“最后一行”。
一旦退出循环,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 || '}';
答案 1 :(得分:4)
您可以这样做。您需要一个布尔变量:
first := true;
在循环内:
if not first then
pseudojson := pseudojson || ',';
end if;
first := false;
-- Add the element
...