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.