iakioの日記 RSSフィード

2008-04-29

カンマ区切りの文字列を複数の行に分割する方法

| 02:31 | カンマ区切りの文字列を複数の行に分割する方法 - iakioの日記 を含むブックマーク はてなブックマーク - カンマ区切りの文字列を複数の行に分割する方法 - iakioの日記

ある列以外の全ての列をSELECTする方法(又は複数行をカンマ区切りで連結する方法) - iakioの日記 - postgresqlグループで書いた

=> select array_to_string(ARRAY(select t from tbl1), ',');
 array_to_string
-----------------
 aaa,bbb,ccc
(1 row)

の逆はできないのかな、とふと思いました。つまり、

=> select * from HOGEHOGE(string_to_array('aaa,bbb,ccc', ','));
 HOGEHOGE
----------
 aaa
 bbb
 ccc
(3 row)

となるような関数HOGEHOGEです。

で、無さそうなのでPL/pgSQLで作ってみました。

create or replace function array_enum(anyarray)
  returns setof anyelement as $$
declare
  i integer;
begin
  for i in array_lower($1, 1)..array_upper($1, 1) loop
    return next ($1)[i];
  end loop;
  return;
end;
$$ language plpgsql immutable strict;

PL/pgSQLってanyarray使えるんだ。

=> select * from array_enum(string_to_array('aaa,bbb,ccc', ','));
 array_enum
------------
 aaa
 bbb
 ccc
(3 rows)

5/2追記

コメントいただきました。8.3からregexp_split_to_table()という関数が追加されているそうです。

パターンマッチ - PostgreSQL 8.3.1文章

=> select regexp_split_to_table('aaa,bbb,ccc,ddd', ',');
 regexp_split_to_table
-----------------------
 aaa
 bbb
 ccc
 ddd
(4 rows)

これは簡単♪

syachi5150syachi51502008/04/30 19:378.3以降ならregexp_split_to_table()も使えそうですね

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080429