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

Bagaimana Anda bisa memperluas baris PostgreSQL yang diringkas menjadi kolom terpisah?

9.3 ke atas:kueri lateral

Di PostgreSQL 9.3 atau yang lebih baru, gunakan kueri lateral implisit:

SELECT f.* FROM things t, some_function(t.thing_id) f;

Pilih formulasi ini untuk semua kueri baru . Di atas adalah formulasi standar .

Ini juga berfungsi dengan baik dengan fungsi yang RETURNS TABLE atau RETURNS SETOF RECORD serta fungsi dengan out-params yang RETURNS RECORD .

Ini adalah singkatan dari:

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

Pra-9.3:ekspansi wildcard (dengan hati-hati)

Versi sebelumnya, menyebabkan beberapa evaluasi some_function , apakah tidak bekerja jika some_function mengembalikan satu set, jangan gunakan ini :

SELECT (some_function(thing_id)).* FROM things;

Versi sebelumnya, menghindari beberapa evaluasi some_function menggunakan tipuan lapis kedua. Hanya gunakan ini jika Anda harus mendukung versi PostgreSQL yang cukup lama.

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

Demo:

Penyiapan:

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

uji coba:

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara menggunakan variabel dalam skrip psql

  2. Tidak dapat menyisipkan baris baru ke tabel database postgres?

  3. Gunakan kotak pembatas dari PostGIS dalam kueri Vanilla Postgres

  4. Kesalahan alat Eclipse/Hibernate:Entri classpath arsip tidak ada

  5. DecimalField Mengonversi Nol ke 0E-10