1. ホーム
  2. sql

[解決済み] Oracleで複数行をカンマ区切りリストに結合する方法を教えてください。重複

2022-05-15 11:42:56

質問

簡単なクエリを持っています。

select * from countries

を実行すると、次のような結果になります。

country_name
------------
Albania
Andorra
Antigua
.....

結果を1行で返したいので、こんな感じ。

Albania, Andorra, Antigua, ...

もちろん、私はこの仕事をするためにPL/SQL関数を書くことができます(私はOracle 10gですでにしました)が、このタスクのためのより良い、できれば非Oracle固有のソリューション(または組み込み関数であるかもしれません)はありますか?

私は一般的に、サブクエリで複数行を回避するためにそれを使用します。

私の質問は、同じような質問に基づいています。 SQL サーバー 2005 .

アップデイト : 私の関数はこのような感じです。

CREATE OR REPLACE FUNCTION APPEND_FIELD (sqlstr in varchar2, sep in varchar2 ) return varchar2 is
ret varchar2(4000) := '';
TYPE cur_typ IS REF CURSOR;
rec cur_typ;
field varchar2(4000);
begin
     OPEN rec FOR sqlstr;
     LOOP
         FETCH rec INTO field;
         EXIT WHEN rec%NOTFOUND;
         ret := ret || field || sep;
     END LOOP;
     if length(ret) = 0 then
          RETURN '';
     else
          RETURN substr(ret,1,length(ret)-length(sep));
     end if;
end;

どのように解決するのですか?

straggや関数を作成しない簡単な方法を紹介します。

create table countries ( country_name varchar2 (100));

insert into countries values ('Albania');

insert into countries values ('Andorra');

insert into countries values ('Antigua');


SELECT SUBSTR (SYS_CONNECT_BY_PATH (country_name , ','), 2) csv
      FROM (SELECT country_name , ROW_NUMBER () OVER (ORDER BY country_name ) rn,
                   COUNT (*) OVER () cnt
              FROM countries)
     WHERE rn = cnt
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1;

CSV                                                                             
--------------------------
Albania,Andorra,Antigua                                                         

1 row selected.

他の方もおっしゃっていますが、11g R2以上であれば、よりシンプルなlistaggを使用できるようになりました。

select listagg(country_name,', ') within group(order by country_name) csv
  from countries;

CSV                                                                             
--------------------------
Albania, Andorra, Antigua

1 row selected.