Usa generate_series()
:
select gs.i, t.*
from t cross join lateral
generate_series(start_i, end_i, 1) gs(i);
Estrictamente hablando, el lateral
no es necesario. Pero explica lo que está pasando. También debo señalar que también puedes hacer:
select generate_series(start_i, end_i) as i, t.*
from t;
Sin embargo, generate_series()
afecta el número de filas en la consulta. No me siento cómodo con tales efectos en el SELECT
cláusula.