代码之家  ›  专栏  ›  技术社区  ›  JohnHC

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

  •  3
  • JohnHC  · 技术社区  · 6 年前

    我有一系列的循环,这些循环以一种奇怪的伪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

    从逻辑上讲,我试着在下面

    (一)

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

    和(2)

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

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   Klas Lindbäck    6 年前

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

    first := true;
    

    循环内部:

    if not first then
        pseudojson := pseudojson || ','; 
    end if;
    first := false;
    -- Add the element
    ...
    
        2
  •  4
  •   Littlefoot    6 年前

    通常的 循环中的字符,包括“最后”行。

    一旦你退出循环, 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 || '}';