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

Susunan tidak bersarang dengan satu tingkat

Jelaskan

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]

mengembalikan sama dengan

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]

yang NULL. Saya mengutip dokumen tentang hal itu:

Secara default, nilai indeks batas bawah dimensi array disetel ke satu.

0 tidak memiliki arti khusus di sini. Juga, dengan array dua dimensi, Anda memerlukan dua indeks untuk mendapatkan elemen dasar. Seperti ini:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]

Hasil:

2

Bagian pertama dari pesan Anda agak tidak jelas.

SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])

Hasil:

[1:3][1:3]

Itu dua dimensi dengan 3 elemen (1 hingga 3) masing-masing (9 elemen dasar).
Jika Anda ingin n-1 dimensi maka ini adalah hasil yang benar:

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

Hasil:

{1,2,3,4,5,6,7,8,9}

Itu satu dimensi. unnest() selalu menghasilkan satu elemen dasar per baris. Saya tidak yakin apa hasil yang Anda inginkan sebenarnya. Contoh Anda hanyalah larik 2 dimensi lain dengan satu set kurung kurawal yang hilang ... ?

{1,2,3}, {4,5,6}, {7,8,9}

Jika Anda menginginkan sepotong larik , coba notasi ini:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]

Hasil:

{{1,2,3},{4,5,6}}

Atau ini:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]

Hasil:

{{4,5}}

Untuk meratakan hasilnya (dapatkan larik 1D):

  • Cara memilih larik 1d dari larik 2d postgresql

Baca selengkapnya di manual di sini.

Fungsi

Tes selanjutnya mengungkapkan bahwa fungsi plpgsql ini banyak lebih cepat. Memerlukan Postgres 9.1 atau lebih baru:

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

Lihat:

  • Bagaimana cara menghapus array 2d menjadi array 1d dengan cepat di PostgreSQL?

Ini adalah versi yang ditingkatkan dan disederhanakan dari fungsi yang diposting Lukas:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Untuk versi Postgres <8.4, array_agg() tidak diinstal secara default. Buat dulu:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC=array_append,
 STYPE=anyarray,
 INITCOND='{}'
);

Juga, generate_subscripts() belum lahir. Gunakan sebagai gantinya:

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

Telepon:

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

Hasil

{1,2}
{3,4}
{5,6}

SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres INTERVAL menggunakan nilai dari tabel

  2. Gabungkan dua kolom dan tambahkan menjadi satu kolom baru

  3. Bagaimana cara menonaktifkan integritas referensial di Postgres 8.2?

  4. Waktu postgres dengan kesetaraan zona waktu

  5. postgresql mengembalikan 0 jika nilai yang dikembalikan adalah nol