sql >> Databasteknik >  >> RDS >> PostgreSQL

Returtyp för funktion med array_agg()

En funktion måste deklarera en returtyp. En array kan bara baseras på en välkänd elementtyp. En anonym post är inte tillåten. Så skapa en sammansatt typ som passar dina behov (såvida det inte finns en tabell eller vy som redan definierar radtypen).

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

För teständamål kan du också skapa en tillfällig tabell för att registrera en sammansatt typ under en session:

CREATE TEMP TABLE my_type ( ...)

(En temporär tabell tas bort i slutet av sessionen, alla funktioner som bygger på typen skulle brytas efter det.)

Använd det som bastyp för arrayen. Du kan använda en enkel SQL-funktion för ändamålet:

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;

Ring:

SELECT foo();

Enkelt alternativ med text[]

Du kan också casta till text / text[] . Du förlorar kolumnnamn och typinformation, men det fungerar direkt:

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

Om du faktiskt inte behöver en array kan du skrota array_agg() , returnera enskilda rader och deklarera returtypen med RETURNS TABLE (...) . Sök SO efter tag, hittar du många exempel ..

Kom ihåg att anropa en set-returfunktion med:

SELECT * FROM foo();



  1. Du kan inte ange måltabell "NAME" för uppdatering i FROM-satsen

  2. SQL-fråga för att ta bort dubbletter av värden i en inre koppling med 3 tabeller med två olika databaser

  3. Det går inte att lagra arabiska i MYSQL-databas med PHP

  4. byt namn på tabell till 'NOW() + old_table_name'