PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kembalikan tipe untuk fungsi dengan array_agg()

Suatu fungsi perlu mendeklarasikan tipe pengembalian. Array hanya dapat didasarkan pada tipe elemen yang terkenal. Catatan anonim tidak diperbolehkan. Jadi buat tipe komposit yang sesuai dengan kebutuhan Anda (kecuali ada tabel atau tampilan yang sudah mendefinisikan tipe baris).

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

Untuk tujuan pengujian, Anda juga dapat membuat tabel sementara untuk mendaftarkan tipe komposit selama sesi:

CREATE TEMP TABLE my_type ( ...)

(Tabel sementara dijatuhkan di akhir sesi, semua fungsi yang dibangun pada tipe tersebut akan rusak setelah itu.)

Gunakan itu sebagai tipe dasar untuk array. Anda dapat menggunakan fungsi SQL sederhana untuk tujuan:

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;

Telepon:

SELECT foo();

Alternatif sederhana dengan text[]

Anda juga dapat melakukan transmisi ke text / text[] . Anda kehilangan nama kolom dan informasi jenis, tetapi ini berfungsi di luar kotak:

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

Jika Anda sebenarnya tidak membutuhkan array, Anda dapat menghapus array_agg() , kembalikan masing-masing baris dan nyatakan tipe pengembalian dengan RETURNS TABLE (...) . Cari BEGITU untuk tag, Anda akan menemukan banyak contoh ..

Ingatlah untuk memanggil fungsi pengembalian set dengan:

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. Masukkan NULL alih-alih string kosong dengan PDO

  2. Bagaimana cara menggabungkan dua tabel dengan salah satunya tidak memiliki kunci utama dan panjang karakter yang tidak sama?

  3. Benar-benar menyalin tabel postgres dengan SQL

  4. Temukan titik terdekat di Pandas DataFrames

  5. Bagaimana cara menanyakan pembaruan tambahan postgres sejak titik tertentu (stempel waktu atau id transaksi)?