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

Pilih dari fungsi PostgreSQL yang mengembalikan tipe komposit

Postgres 9.3 atau lebih baru

Gunakan LATERAL bergabung!

SELECT p.id, p.name, p.data, f.*
FROM   tb_projects p
LEFT   JOIN LATERAL fn_getlinkedproject(p.id) f(linked_id, lined_name) ON TRUE;

Hasil:

 id |  data  |  name  | linked_id | linked_name
----+--------+--------+-----------+-------------
  1 | data_1 | name_1 |         2 | name_2
  2 | data_2 | name_2 |         3 | name_3
  3 | data_3 | name_3 |         1 | name_1

Lihat:

Postgres 9.2 atau lebih lama

Rendah karena beberapa alasan. Melampirkan alias kolom tidak sesederhana itu. Ganti nama lain yang saling bertentangan:

SELECT p.id AS p_id, p.data AS p_data, p.name AS p_name, (fn_getlinkedproject(p.id)).*
FROM   tb_projects p;

Hasil:

 p_id | p_data | p_name | id |  name
------+--------+--------+----+--------
    1 | data_1 | name_1 |  2 | name_2
    2 | data_2 | name_2 |  3 | name_3
    3 | data_3 | name_3 |  1 | name_1

Untuk mengganti nama kolom hasil, Anda harus:

SELECT p.id, p.data, p.name
     ,(fn_getlinkedproject(p.id)).id   AS linked_id
     ,(fn_getlinkedproject(p.id)).name AS linked_name
FROM   tb_projects p;

Kedua solusi lama menyelesaikan rencana kueri yang sama (buruk) untuk memanggil fungsi berulang kali.

Untuk menghindarinya, gunakan subquery:

SELECT p.id, p.data, p.name
    , (p.x).id AS linked_id, (p.x).name AS linked_name
FROM  (SELECT *, fn_getlinkedproject(id) AS x FROM tb_projects) p;

Perhatikan penempatan tanda kurung essential yang penting .
Baca manual tentang jenis komposit .

Demo

CREATE TYPE dm_nameid AS (
  id   int
, name text); -- types simplified for demo

CREATE TABLE tb_projects(
  id   int
, data text
, name text);

INSERT INTO tb_projects VALUES
  (1, 'data_1', 'name_1')
, (2, 'data_2', 'name_2')
, (3, 'data_3', 'name_3');

CREATE function fn_getlinkedproject(integer)  -- avoiding CaMeL-case for demo
  RETURNS dm_nameid LANGUAGE sql AS
'SELECT id, name FROM tb_projects WHERE id = ($1 % 3) + 1';

db<>fiddle di sini




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang terjadi dengan NOTIFY ketika tidak ada sesi yang mengeluarkan LISTEN di PostgreSQL?

  2. PostgreSQL:Buat indeks pada stempel waktu::DATE

  3. Bagaimana mengubah tipe data kolom dari karakter ke numerik di PostgreSQL 8.4

  4. Berikan nama skema dan nama tabel secara dinamis di FROM dalam kueri pemilihan di Postgres

  5. INSERT a SELECT GROUP BY :lebih banyak kolom target daripada kesalahan ekspresi