Eu tenho uma tabela que contém essencialmente 3 colunas: ID
, FIRST
, LAST
. São todos inteiros.
Eu estou querendo saber se há uma maneira de usar generate_series() para obter um resultado de consulta onde para cada linha na tabela original, há muitas linhas contendo números entre FIRST
e LAST
?
Por exemplo, para uma linha com dados a (42, 5, 8)
saída contém linhas (42, 5)
, (42, 6)
e (42, 7)
.(42, 8)
Isso pode ser conseguido usando
generate_series()
Exemplo online: https://rextester.com/TWE47868
No Postgres 10 ou posterior pode ser tão simples quanto:
Em versões mais antigas não é aconselhável ter funções de retorno de set na
SELECT
lista. Ver:As linhas onde
generate_series()
não retorna nada são excluídas do resultado dessa maneira (por exemplo, quandolast
<first
ou qualquer um éNULL
). O mesmo vale para aCROSS JOIN
variante de sintaxe mais explícita demonstrada por a_horse . Pode ou não ser desejável. Se não for, useLEFT JOIN .. ON true
em vez disso:(
LATERAL
é uma palavra de ruído neste caso, pois é assumida para funções naFROM
lista.)Ver:
db<>fiddle aqui (demonstrando casos de canto)