0

I have the following data:

cte
=================
gp_id | m_ids
------|----------
1     | {123}
2     | {432,222}
3     | {123,222}

And a function with a signature like this (which in fact returns not a table but a couple of ids):

FUNCTION foo(m_ids integer[])
RETURNS TABLE (
    first_id integer,
    second_id integer
)

Now, I've got to iterate over each row and perform some calculations with that function, so I would get something like this:

gp_id | first_id | second_id 
------|----------|-----------
1     | 25       | 25        
2     | 13       | 24        
3     | 25       | 11        

To achieve that I tried the following code:

SELECT gp_id, 
       ( 
              SELECT * 
              FROM   foo( 
                     ( 
                            SELECT m_ids 
                            FROM   cte c2 
                            WHERE  c2.gp_id = c1.gp_id)) limit 1) 
FROM   cte c1

The problem is in the SELECT * statement. If I use SELECT first_id, everything works well (except for that I have to run two consecutive queries, which I'd like to avoid, obviously), but in the former case I'm getting the error

subquery must return only one column

which is somewhat expected.
So how can I correctly iterate over the table in one single query?

1 Answer 1

1

Use the function in a lateral join:

select gp_id, first_id, second_id
from cte, 
lateral foo(m_ids);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.