Home > Net >  Why LATERAL not works with values?
Why LATERAL not works with values?

Time:10-03

It not make sense, a literal is not a valid column?

SELECT x, y FROM (select 1 as x) t, LATERAL CAST(2 AS FLOAT) AS y; -- fine
SELECT x, y FROM (select 1 as x) t, LATERAL 2.0 AS y; -- SYNNTAX ERROR!

Same if you use CASE clause or x 1 expression or (x 1)... seems ERROR for any non-function.

The Pg Guide, about LATERAL expression (not LATERAL subquery), say

LATERAL is primarily useful when the cross-referenced column is necessary for computing the row(s) to be joined (...)


NOTES

The question is about LATERAL 1_column_expression not LATERAL multicolumn_subquery. Example:

SELECT x, y, exp, z
FROM (select 3) t(x), -- subquery
     LATERAL round(x*0.2 1.2) as exp,  -- expression!
     LATERAL (SELECT exp 2.0 AS y, x||'foo' as z) t2  --subquery
;

... After @klin comment showing that the Guide in another point say "only functions", the question Why? must be expressed in a more specific way, changing a litle bit the scope of the question:

Not make sense "only funcions", the syntax (x) or (x 1), encapsulatening expression in parentesis, is fine, is not?
Why only functions?

PS: perhaps there is a future plan, or perhaps a real problem on parsing generic expressions... As users we must show to PostgreSQL developers what make sense and we need.

CodePudding user response:

It'll all work fine if you wrap it in its own subquery

SELECT x, y FROM (select 1 as x) t, LATERAL (SELECT 2.0 AS y) z;

CodePudding user response:

A literal is a valid value for a column, but as the docs you quoted say, LATERAL syntax is used

for computing the row(s) to be joined

A relation, such as a FROM or JOIN or LATERAL subquery clause, always computes tuples of (a single or multiple) columns. The alias you're assigning is not for an individual row, but for the whole tuple.

  • Related