Eu quero os lexemas de um array tsvector colocado em uma coluna, um por linha. Eu posso primeiro desaninhar a matriz e depois os tsvectors resultantes com:
SELECT (unnest(unnest(my_array))).lexeme
FROM my_table
WHERE id = 1;
que dá:
lexeme
----------
foo
bar
baz
...
Percebi, no entanto, que se eu tentar fazer o mesmo na cláusula FROM:
SELECT lexeme
FROM unnest(
(SELECT unnest(my_array) FROM my_table WHERE id = 1)
);
Eu recebo:
ERRO: mais de uma linha retornada por uma subconsulta usada como expressão
Então, eu acabo fazendo isso:
SELECT lexeme
FROM (
SELECT (unnest(col1)).lexeme
FROM (
SELECT unnest(my_array)
FROM my_table
WHERE id = 1
) AS t(col1)
) AS t2;
E eu recebo o resultado original. Mas isso é verboso. Então, gostaria de saber:
Por que unnest() requer uma única linha de entrada na cláusula FROM, mas não na cláusula SELECT?
Existe uma maneira mais concisa e menos complicada do que meu código para obter a coluna de lexemas na cláusula FROM?
Existe uma diferença de desempenho entre desaninhar na cláusula SELECT versus fazê-lo na cláusula FROM?
Você não deveria usar operadores de retorno de conjunto no
select
, mesmo que o PostgreSQL permita.É muito melhor colocá-los no
from
e usar umalateral
junção