Stringverkettung als Spaltenalias

Ludwigmller

SQL-Guru
Beiträge
171
Hallo,
Kann man den Spaltenalias aus einer Stringverkettung mit einem Funktionsparameter bilden?

Code:
CREATE OR REPLACE FUNCTION neue_funktion(IN p_jahr integer)
    RETURNS TABLE
    (
        spalte1 varchar(20),
        spalte2 integer
    )
LANGUAGE 'sql'
    VOLATILE
    PARALLEL UNSAFE
    COST 100    ROWS 1000

AS $BODY$

SELECT
    spalte1 as test,
    spalte2 as CONCAT('Anzahl ', p_jahr)
FROM
    andere_funktion(p_jahr)  
$BODY$;
Gleichzeitig müsste ja die Funktion unter RETURNS TABLE ( spalte1 varchar(20), .... ) dynamisch angepasst werden.
 
Werbung:
Mir ist nicht ganz klar, was Du erreichen möchtest. Falls Du dynamisch einen String erstellen willst, der ein SQL-Statement enthält (dynamisch ersteller Spaltenname), dann kann Du diesen String via EXECUTE ausführen. Die Doku hat dazu ein eigenes Kapitel.
Allerdings erscheint mir die Idee, dynamisch auf diese Art und Weise Tabellen erstellen zu wollen nur bedingt sinnvoll.
 
wie gesagt, Du scheinst EXECUTE noch nicht gefunden zu haben:

Code:
postgres=# create or replace function create_table(colname text) returns text as $$begin execute 'create table ludwigmller(id serial, ' || colname || ' text);'; return true; end$$language plpgsql;
CREATE FUNCTION
postgres=# \d ludwigmller
Did not find any relation named "ludwigmller".
postgres=# select * from create_table('bla');
 create_table 
--------------
 true
(1 row)

postgres=# \d ludwigmller
                            Table "public.ludwigmller"
 Column |  Type   | Collation | Nullable |                 Default                 
--------+---------+-----------+----------+-----------------------------------------
 id     | integer |           | not null | nextval('ludwigmller_id_seq'::regclass)
 bla    | text    |           |          | 

postgres=#

Achtung: language ist plpgsql, nicht sql.
 
Execute () kannte ich noch nicht, danke.


Allerdings erscheint mir die Idee, dynamisch auf diese Art und Weise Tabellen erstellen zu wollen nur bedingt sinnvoll.
Was ist daran nicht sinnvoll, bzw wie geht es besser? Es gibt Spalten für Werte verschiedener Jahre (bei einem Parameter das angegebene Jahr und das Vorjahr, bei zwei Parametern die angegebenen Jahre) die verglichen werden können sollen.
 
Zu wenig Kontext, ich kenne deinen Usecase nicht. Mir gruselt es halt bei dem Gedanken, daß da regelmäßig eine Funktion aufgerufen wird, die bei jedem Aufruf eine neue Tabelle erstellt...
 
Werbung:
Der Funktionsparameter soll im Spaltenname enthalten sein.
Das geht nicht (dynamisch). Es gibt nur zwei Optionen um die Spaltennamen zu definieren. Als Teil des returns table(...) - so wie Du es jetzt hast. Oder aber die Funktion wird als returns setof record definiert, dann muss man aber zwingend bei der Verwendung der Funktion die Spaltennamen angeben

Code:
select *
from neue_funktion(2022) as f(eine_spalte, andere_spalte)
 
Zurück
Oben