Menggunakan Postgres 9.0, saya perlu cara untuk menguji apakah ada nilai dalam array yang diberikan. Sejauh ini saya datang dengan sesuatu seperti ini:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Tapi saya terus berpikir harus ada cara yang lebih sederhana untuk ini, saya tidak bisa melihatnya. Ini tampaknya lebih baik:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Saya yakin ini sudah cukup. Tetapi jika Anda memiliki cara lain untuk melakukannya, silakan bagikan!
sumber
ANY/ALL (array) requires array on right side
, tambah::int[]
melakukan pesona.'something' = ANY(some_array)
juga dapat digunakan dalamWHERE
klausa. Untuk alasan yang hanya diketahui Crom, saya telah menghabiskan empat tahun terakhir berpikir bahwa saya tidak dapat menggunakan pembanding array dalamWHERE
klausa. Hari-hari itu hilang sekarang. (Saya dijatuhkan di kepala saya sebagai seorang anak, jadi mungkin itu hanya saya).boolean
bekerja diWHERE
klausa - Crom bersedia.Perhatikan jebakan yang saya hadapi: Saat memeriksa apakah nilai tertentu tidak ada dalam array, Anda seharusnya tidak melakukannya:
tapi gunakan
sebagai gantinya.
sumber
ALL
vsANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
mungkin lebih mudah dibacaAnda dapat membandingkan dua array. Jika salah satu nilai dalam array kiri tumpang tindih dengan nilai-nilai dalam array kanan, maka itu mengembalikan true. Ini semacam peretasan, tetapi berhasil.
1
berada di array yang benartrue
, meskipun nilainya4
tidak terkandung dalam array yang benar4
) berada di larik kanan, sehingga mengembalikanfalse
sumber
unnest
bisa digunakan juga. Itu memperluas array ke satu set baris dan kemudian hanya memeriksa nilai yang ada atau tidak sesederhana menggunakanIN
atauNOT IN
.misalnya
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
sumber
Saat mencari keberadaan elemen dalam array, casting yang tepat diperlukan untuk melewatkan parser SQL postgres. Berikut adalah satu contoh permintaan menggunakan array yang berisi operator dalam klausa gabungan:
Untuk kesederhanaan, saya hanya mencantumkan bagian yang relevan:
Bagian bergabung dari SQL ditampilkan
Berikut ini juga berfungsi
Saya hanya menebak bahwa casting tambahan diperlukan karena parse tidak harus mengambil definisi tabel untuk mengetahui tipe kolom yang tepat. Lainnya harap berkomentar tentang ini.
sumber
Hai yang satu berfungsi dengan baik untuk saya, mungkin berguna untuk seseorang
pilih * dari your_table di mana array_column :: text ilike ANY (ARRAY ['% text_to_search%' :: text]);
sumber