sql >> データベース >  >> RDS >> Oracle

Oracle:区切り文字と連結しますが、両方のオペランドがNULLでない場合のみ

    10gを使用しているので、うまくいきません。ただし、完全を期すために、 LISTAGG()> NULLを処理します 値は「正しく」。そのためには、11g2に更新する必要があります:

    -- Some sample data, roughly equivalent to yours
    with t as (
      select 'foo' as x from dual union all
      select null       from dual union all
      select 'bar'      from dual
    )
    -- Use the listagg aggregate function to join all values
    select listagg(x, ';') within group (order by rownum)
    from t;
    

    または、テーブルの列を一覧表示する場合は、もう少し簡潔にします。

    -- I use SYS.ORA_MINING_VARCHAR2_NT as a TABLE TYPE. Use your own, if you prefer
    select listagg(column_value, ';') within group (order by rownum)
    from table(ORA_MINING_VARCHAR2_NT('foo', null, 'bar'));
    

    または実際のテーブルに対して:

    select listagg(column_value, ';') 
           within group (order by rownum)
    from Table1
    cross join table(ORA_MINING_VARCHAR2_NT(Table1.a, Table1.b, Table1.c))
    group by Table1.id;
    

    これが元の例よりもはるかに優れている(読みやすい)かどうかはわかりません:-)



    1. 大きな主キー:10億行以上のMySQL + InnoDB?

    2. 日本語の文字を使用したMySQL

    3. sql-queryで配列/変数を使用する

    4. SQLServerでのDateTimeのYYYY-MM-DD形式への変換