sql >> Database teknologi >  >> RDS >> PostgreSQL

Returtype for funktion med array_agg()

En funktion skal erklære en returtype. Et array kan kun baseres på en velkendt elementtype. En anonym registrering er ikke tilladt. Så opret en sammensat type, der passer til dine behov (medmindre der er en tabel eller visning, der allerede definerer rækketypen).

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

Til testformål kan du også oprette en midlertidig tabel for at registrere en sammensat type for varigheden af ​​en session:

CREATE TEMP TABLE my_type ( ...)

(En midlertidig tabel slettes i slutningen af ​​sessionen, en hvilken som helst funktion, der bygger på typen, ville blive ødelagt efter det.)

Brug det som basistype for arrayet. Du kan bruge en simpel SQL-funktion til formå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 til:

SELECT foo();

Simpelt alternativ med text[]

Du kan også caste til text / text[] . Du mister kolonnenavne og typeoplysninger, men det fungerer ud af boksen:

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

Hvis du faktisk ikke har brug for et array, kan du slette array_agg() , returner individuelle rækker og erklær returtypen med RETURNS TABLE (...) . Søg SO efter tag, finder du mange eksempler ..

Husk at kalde en sæt-retur-funktion med:

SELECT * FROM foo();



  1. Sådan viser du alle lokaliteter i MariaDB

  2. SQL Server:fascineret af GETDATE()

  3. Hentning af godkendelse mislykkedes fejl med postgresql fra kommandolinjen

  4. CURRENT_DATE/CURDATE() fungerer ikke som standardværdi for DATE