【问题标题】:Ingres SQL select multiple rows into one columnIngres SQL 将多行选择为一列
【发布时间】:2016-09-21 22:45:22
【问题描述】:

我们的数据库位于 Ingres II 10.0.0 (su9.us5/132) 上。因此,它缺少许多有用的功能,例如填充、合并等,这些功能使得将多行数据合并到一列变得极其困难。

原来是这样的:How to GROUP_CONCAT in Ingres?,但我们的数据结构无法解决这个问题。

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

例如:
123 ABC
123 防御
123 GHI
189 ABC
第189章

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

我还没有找到可行的选择。

任何想法将不胜感激。

谢谢。

【问题讨论】:

    标签: sql ingres


    【解决方案1】:

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

    这是一个简单的示例,您可以根据自己的需要对其进行调整。如果您希望连接的结果很长,请不要忘记 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();
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2022-06-23
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多