2010-04-21 7 views
0

Existe-t-il un moyen simple en SQL de convertir une chaîne ou un tableau en lignes d'une table? Par exemple, restons la chaîne est 'a, b, c, d, e, f, g'. Je préférerais une instruction SQL qui prend cette chaîne, la divise en virgules et insère les chaînes résultantes dans une table. Dans PostgreSQL, je peux utiliser regexp_split_to_array() et diviser la chaîne en un tableau. Donc, si vous connaissez un moyen d'insérer des éléments d'un tableau en tant que lignes dans une table, cela fonctionnerait aussi.SQL: convertir des jetons dans une chaîne ou des éléments d'un tableau en lignes d'une table

+0

Excellentes réponses et commentaires. Merci à tous! – slowpoison

Répondre

4

pour mettre un tableau dans un ensemble de lignes, vous pouvez simplement utiliser unnest():

SELECT unnest('{1,2,3,4}'::int[]) 

que vous pouvez ensuite bien sûr combiner avec regexp_split_to_array, pour devenir: Ou comme mentionné précédemment, en utilisant string_to_array() au lieu de regexp_split_to_array() s'il s'agit d'une simple division.

+0

Il est peut-être important de noter que 'unnest' existe depuis Postgres 8.4 et plus. – Wolph

+0

Oh ouais, bon point. –

1

J'utiliser string_to_array à la place, il est un peu plus vite :) Peu importe si, vous pouvez créer un table hors de lui avec quelques astuces generate_series.

CREATE OR REPLACE FUNCTION array_to_table(anyarray) 
RETURNS SETOF anyelement AS $$ 
SELECT $1[i] 
FROM generate_series(array_lower($1,1), array_upper($1,1)) g(i); 
$$ LANGUAGE SQL STRICT IMMUTABLE; 

SELECT * FROM array_to_table(string_to_array('a,b,c,d,e,f,g', ',')); 
0

generate_series (DE, DE, STEP) avec (1, 7, 2) produit une série 1, 3, 5, 7 qui peut être utilisé pour indexer le tableau de sous-chaîne (colonne, INDEX, LEN) :

SELECT substring ('a,b,c,d', generate_series (1, 7, 2), 1) AS x ; 
x 
--- 
a 
b 
c 
d 
Questions connexes