web-dev-qa-db-fra.com

Fractionner la colonne en plusieurs lignes dans Postgres

Supposons que j'ai une table comme celle-ci:

    subject     | flag
----------------+------
 this is a test |    2

subject est de type text et flag est de type int. Je voudrais transformer ce tableau en quelque chose comme ça dans Postgres:

    token       | flag
----------------+------
 this           |    2
 is             |    2
 a              |    2
 test           |    2

Y a-t-il un moyen facile de faire ceci?

33
mgoldwasser

Dans Postgres 9.3+, utilisez une jointure LATERAL:

SELECT s.token, flag
FROM   tbl t, unnest(string_to_array(t.subject, ' ')) s(token)
WHERE  flag = 2;

Notez que la forme abrégée d'une jointure LATERAL ne renvoie que des lignes, si unnest() retourne réellement des lignes.

Vous pouvez également utiliser regexp_split_to_table() , mais c'est généralement plus lent car la correspondance des expressions régulières coûte un peu plus cher.
En relation:

51

Je pense qu'il n'est pas nécessaire d'utiliser une jointure, juste la fonction unnest() en conjonction avec string_to_array() devrait le faire:

SELECT unnest(string_to_array(subject, ' ')) as "token", flag FROM test;

unnest | token                                                                                                   
-------+-------                                                                                                  
this   |     2                                                                                                   
is     |     2                                                                                                   
a      |     2                                                                                                   
test   |     2                                                                                                   
3
Matt