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?
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:
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