首页 文章

Ingres SQL在一列中选择多行

提问于
浏览
0

我们的数据库是Ingres II 10.0.0(su9.us5 / 132) . 因此,它缺少许多有用的函数,如stuff,coalesce等,这使得将多行数据合并到一列非常困难 .

有这样的:How to GROUP_CONCAT in Ingres?但是我们的数据结构不可能解决这个问题 .

基本上有一个表有一个参考号,如果它们有多个状态,每行可以多次包含该参考号 .

例如:
123 ABC
123 DEF
123 GHI
189 ABC
189 GHI

我将数据从多个表中提取到一个select语句中,这只是我追求的数据的一部分 . 所以我希望将'ABC','DEF','GHI'选为一列,而不是以他们拥有的每个状态结束三行重复人 .

我还没有找到一个可行的选项 .

任何想法将不胜感激 .

谢谢 .

1 回答

  • 0

    我认为你应该能够使用行生成过程来实现这一点 .

    这是一个快速示例,您可以根据自己的需要进行调整 . 如果您期望连续结果很长,请不要忘记varchar的最大长度是32000 .

    create table myx(a integer not null, b char(3));
    insert into myx values(123,'ABC');
    insert into myx values(123,'DEF');
    insert into myx values(123,'GHI');
    insert into myx values(189,'ABC');
    insert into myx values(189,'GHI');
    
    create procedure myproc
    result row r(a integer not null, b varchar(1000))=
    declare aval=integer;
            bval=varchar(1000);
            newa=integer;
            newb=char(3);
    begin
      aval=NULL;
      bval='';
      for select a,b into :newa, :newb from myx order by a,b
      do
        if :aval != :newa or :aval is null
        then
          if :aval is not null
          then
            return row(:aval, :bval);
          endif;
          aval = :newa;
          bval = :newb;
        else
          bval=:bval+','+:newb;
        endif;
      endfor;
      if :aval is not null
      then
        return row(:aval, :bval);
      endif;
    end;
    
    select * from myproc();
    

相关问题