Execute a dynamic crosstab query

前端 未结 2 924
迷失自我
迷失自我 2020-11-27 22:45

I implemented this function in my Postgres database: http://www.cureffi.org/2013/03/19/automatically-creating-pivot-table-column-names-in-postgresql/

Here\'s the fun

2条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-27 23:16

    Not quite impossible, you can still execute it (from a query execute the string and return SETOF RECORD.

    Then you have to specify the return record format. The reason in this case is that the planner needs to know the return format before it can make certain decisions (materialization comes to mind).

    So in this case you would EXECUTE the query, return the rows and return SETOF RECORD.

    For example, we could do something like this with a wrapper function but the same logic could be folded into your function:

    CREATE OR REPLACE FUNCTION crosstab_wrapper
    (tablename varchar, rowc varchar, colc varchar, 
     cellc varchar, celldatatype varchar) 
    returns setof record language plpgsql as $$
        DECLARE outrow record;
        BEGIN
           FOR outrow IN EXECUTE xtab($1, $2, $3, $4, $5)
           LOOP
               RETURN NEXT outrow
           END LOOP;
        END;
     $$;
    

    Then you supply the record structure on calling the function just like you do with crosstab. Then when you all the query you would have to supply a record structure (as (col1 type, col2 type, etc) like you do with connectby.

提交回复
热议问题