web-dev-qa-db-ja.com

sqlは文字列をスペースごとにpostgresqlのテーブルに分割します

Regexp_split_to_tableのような関数を探していますが、データベースはバージョン8.2.9であるため、ありません。私は実際にはスペースで分割しているだけなので、次のような文字列

どうやって茶色の牛

戻るだろう

+------+
|Column|
+------+
|how   | 
|now   | 
|brown | 
|cow   |
+------+

これを処理できる簡単な関数、または自分で作成する必要があるものはありますか?

17
veilig

Unnest関数を使用して配列を結果セットに分割したり、string_to_array関数を使用して文字列リテラルを配列に変換したりできます。両方を組み合わせると、次のようになります。

alvherre=# select unnest(string_to_array('the quick lazy fox', ' '));
 unnest 
--------
 the
 quick
 lazy
 fox
(4 filas)

8.2にはUNNESTがないため、次のようにPostgreSQLで記述できます。

create or replace function unnest(anyarray) returns setof anyelement
language sql as $$
   select $1[i] from generate_series(array_lower($1, 1),
                                     array_upper($1, 1)) as i;
$$; 
37
alvherre

私はあなたがする必要があると思いますRETURNS SETまたはRETURNS TABLEあなた自身。

更新された回答: PL/pgSQLを使用:

pg=> CREATE OR REPLACE FUNCTION string_to_rows(text) RETURNS SETOF TEXT AS $$ 
  DECLARE
    elems text[];      
  BEGIN
    elems := string_to_array($1, ' ');
    FOR i IN array_lower(elems, 1) .. array_upper(elems, 1) LOOP
      RETURN NEXT elems[i];
    END LOOP;
    RETURN;
  END
$$ LANGUAGE 'plpgsql';
CREATE FUNCTION

pg=> SELECT "Column" FROM string_to_rows('how now brown cow') d("Column");
 Column 
--------
 how
 now
 brown
 cow
(4 rows)

元の回答: PL/Perlの使用:

pg=> CREATE LANGUAGE plperl; 
CREATE LANGUAGE

pg=> CREATE FUNCTION psplit_to_rows(text) RETURNS SETOF TEXT AS $$
pg$>   for my $t (split ' ', $_[0]) { return_next $t; }
pg$>   undef;
pg$> $$ LANGUAGE plperl;
CREATE FUNCTION

pg=> SELECT "Column" FROM psplit_to_rows('how now brown cow') d("Column");
 Column 
--------
 how
 now
 brown
 cow
(4 rows)

もちろん、これを拡張して、選択した区切り文字などを処理できます(注:「Column」という名前の列が本当に必要かどうかはわかりません。キーワードの衝突を避けるために識別子の引用が必要ですが、あります)。

2
pilcrow