PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zwróć typ funkcji z array_agg()

Funkcja musi zadeklarować zwracany typ. Tablica może być oparta tylko na dobrze znanym typie elementu. Anonimowy rekord jest niedozwolony. Stwórz więc typ złożony, który odpowiada Twoim potrzebom (chyba że istnieje tabela lub widok już definiujący typ wiersza).

CREATE TYPE my_type (
  ts          text
, alertlevel  int
, time_passed interval
);

Do celów testowych możesz również utworzyć tabelę tymczasową, aby zarejestrować typ złożony na czas trwania sesji:

CREATE TEMP TABLE my_type ( ...)

(Tabela tymczasowa jest usuwana na koniec sesji, każda funkcja oparta na typie zostanie po tym zepsuta).

Użyj tego jako typu podstawowego dla tablicy. W tym celu możesz użyć prostej funkcji SQL:

CREATE OR REPLACE FUNCTION foo()
  RETURNS my_type[] AS
$func$
SELECT array_agg(result::my_type)  -- you must cast the row type!
FROM  (
   SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
        , "AlertLevel"
        , "Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
   FROM   "Judgements"
   WHERE  "SampleID" = sampleid
   AND    "Timestamp" >= starttime
   AND    "Timestamp" <= stoptime
   ) result
WHERE "AlertLevel" > 0;
$func$
LANGUAGE sql;

Zadzwoń:

SELECT foo();

Prosta alternatywa z text[]

Możesz także przesyłać do text / text[] . Tracisz nazwy kolumn i informacje o typach, ale działa to po wyjęciu z pudełka:

CREATE OR REPLACE FUNCTION foo()
  RETURNS text[] AS
$func$
SELECT array_agg(result::text)  -- cast the record to text!
FROM  ( ... ) result
...;
$func$
LANGUAGE sql;

Jeśli faktycznie nie potrzebujesz tablicy, możesz usunąć array_agg() , zwróć poszczególne wiersze i zadeklaruj typ zwracany za pomocą RETURNS TABLE (...) . Wyszukaj SO dla tag, znajdziesz wiele przykładów ..

Pamiętaj, aby wywołać funkcję zwracania zestawu za pomocą:

SELECT * FROM foo();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić do tabeli z innej tabeli, dopasowując wartości?

  2. Jak INTERSECT działa w PostgreSQL

  3. Postgres kopiuje Heroku Production DB do lokalnego rozwoju DB

  4. PostgreSQL:UPDATE za pomocą funkcji agregującej

  5. Jak wybrać dane z tabeli podrzędnej w PostgreSQL?