2016-05-24 14 views
2

Ich habe eine materialisierte Ansicht in Postgres wieKann ich eine String-Liste von einer Postgres-Funktion zurückgeben?

CREATE MATERIALIZED VIEW my_view AS SELECT * FROM my_table WHERE my_column NOT IN ('a', 'b', 'c'); 

Aber ('a', 'b', 'c') Teil meiner Business-Logik ist, und ich möchte es machen können, in ('a', 'b', 'c', 'd') oder ('a') ohne my_view zu löschen und erneut erstellen es, da es hat eine Reihe abhängiger Ansichten. Deshalb möchte ich die Definition von my_view um so etwas wie

CREATE MATERIALIZED VIEW my_view AS SELECT * FROM my_table WHERE my_column NOT IN my_unwanted_list(); 

ersetzen Und dann würde my_unwanted_list nur eine Konstante zurückkehren, dass ich setzen konnte, was ich will von my_unwanted_list ‚s Definition zu aktualisieren. Dann kann ich einen unerwünschten Wert hinzufügen, indem ich einfach my_unwanted_list aktualisiere und my_view aktualisiere.

Aber ich habe einige Probleme, die Syntax für my_unwanted_list richtig zu bekommen. Wie schreibe ich eine PostgreSql-Funktion, die etwas zurückgibt, das ich in einem Filter IN verwenden kann?

Antwort

1

Sie können die Werte setzen in einem array und vergleichen gegen seine Elemente mit den ANY()/ALL() Konstrukte:

CREATE FUNCTION my_unwanted_list() RETURNS TEXT[] AS $$ 
    SELECT ARRAY['a', 'b', 'c'] 
$$ LANGUAGE sql IMMUTABLE; 

CREATE MATERIALIZED VIEW my_view AS 
    SELECT * FROM my_table 
    WHERE my_column <> ALL(my_unwanted_list()); 
1

Wenn Sie Ihre Funktion soll die Ergebnisse einer Abfrage zurückzukehren, oder Sie lieber verwenden IN statt <>ALL(array) (wie @NickBarnes schlägt vor), können Sie Folgendes tun:

CREATE FUNCTION my_unwanted_list() RETURNS SETOF TEXT AS $$ 
    SELECT col 
    FROM table 
    WHERE condition 
$$ LANGUAGE sql IMMUTABLE; 

CREATE MATERIALIZED VIEW my_view AS 
    SELECT * FROM my_table 
    WHERE my_column NOT IN (SELECT my_unwanted_list()); 
Verwandte Themen