Bagaimana menemukan ukuran array di postgresql

98

Apakah ada cara untuk menemukan ukuran larik?

Sebagai contoh,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

INSERT INTO exam VALUES ( '{5,6,7}');

Dari sini, adakah kemungkinan untuk mendapatkan hasil seperti berikut,

size

0

3
aabi
sumber

Jawaban:

120

Seperti yang disebutkan vyegorov, array_lengthakan berhasil. Atau jika Anda mengetahui bahwa array tersebut 1 dimensi (yang kemungkinan besar) dan menjalankan PostgreSQL 9.4 atau lebih tinggi, Anda dapat menggunakan cardinality:

SELECT cardinality(id) FROM example;
Adam Dingle
sumber
10
Jika ada yang dapat menyebutkan perbedaan utama dalam menggunakan panjang_larik dan kardinalitas yang akan sangat bagus
Zia Ul Rehman Mughal
6
cardinalitymengembalikan jumlah semua elemen dalam larik tunggal atau multidimensi. Jadi select cardinality(ARRAY[[1,2], [3,4]]);akan kembali 4, sedangkan select array_length(ARRAY[[1,2], [3,4]], 1)akan kembali 2. Jika Anda menghitung dimensi pertama, array_lengthitu taruhan yang lebih aman.
Roshambo
2
Ini juga berfungsi untuk array yang disimpan dalam bidang dengan texttype, while function array_length(text[]) does not exist;)
santuxus
1
@ZiaUlRehmanMughal juga panjang larik dari larik kosong yang secara tak terduga mengevaluasi ke nulldan bukan 0sementara cardinalitymengembalikan apa yang Anda harapkan. Tidak tahu apa yang mereka pikirkan dengan logika itu.
EoghanM
82

Ini dokumen membaca sepele :

SELECT array_length(id, 1) FROM example;
vyegorov
sumber
13
Apakah Anda tahu apa parameter kedua dari fungsi tersebut array_length. Tidak menemukan info itu di dokumen.
suzanshakya
19
@suzanshakya, panjang dimensi array yang dimintaツ
vyegorov
5
Ini akan kembali nulldan 3bukannya 0dan 3untuk contoh OP. Pasti harus mempromosikan penggunaan cardinalityketika menerima jawaban karena lebih mudah digunakan dan tidak terlalu terduga (saya membayangkan 99,999% penggunaan array adalah dimensi tunggal)
EoghanM
9

Dengan asumsi dimensi array akan selalu 1 bukanlah sesuatu yang saya rasa nyaman, jadi saya pergi dengan yang berikut:

SELECT coalesce(array_length(id, 1), 0) as size FROM example;

Sudah ... setidaknya satu dekade, tapi kami biasa melakukan banyak coalescehal dan itu sangat berguna. Mungkin saya meraihnya karena kenyamanan?

jc00ke.dll
sumber
3

Harus menggunakan array_upper di postgres 8.2.

Sean Anderson
sumber
Penolong. Karena hampir semua posting di luar sana menggunakan array_length () dengan asumsi orang menggunakan postgres 9+; (
uniquegino