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

Melewati array array sebagai parameter ke suatu fungsi

Saya suka pendekatan kedua Anda.

SELECT DISTINCT t.*
FROM   (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN   (
   SELECT arr[1]::int[] AS a1
         ,arr[2]::int[] AS b1
   FROM   (
      SELECT unnest(ARRAY['{"{1,2}", "{3,4}"}'
                         ,'{"{}"   , "{4,5,6}"}'
                         ,'{"{5}"  , "{}"}'    -- added element to 1st dimension
                         ])::text[] AS arr     -- 1d text array
      ) sub
   ) s ON (a = ANY(a1) OR a1 = '{}')
      AND (b = ANY(b1) OR b1 = '{}')
;

Menyarankan hanya perbaikan kecil:

  1. Subkueri alih-alih CTE untuk kinerja yang sedikit lebih baik.

  2. Pengujian sederhana untuk larik kosong:memeriksa '{}' literal alih-alih panggilan fungsi.

  3. Kurang satu tingkat subquery untuk membuka bungkus array.

Hasil:

a | b
--+---
2 | 3
7 | 4
1 | 4
5 | 1

Untuk pembaca biasa:Membungkus array multi-dimensi bilangan bulat diperlukan, karena Postgres menuntut itu (mengutip pesan kesalahan):

Sebuah rute alternatif akan dengan larik teks 2 dimensi dan hapus sarangnya menggunakan generate_subscripts() :

WITH a(arr) AS (SELECT '{{"{1,2}", "{3,4}"}
                        ,{"{}", "{4,5,6}"}
                        ,{"{5}", "{}"}}'::text[]   -- 2d text array
             )
SELECT DISTINCT t.*
FROM  (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN  (
   SELECT arr[i][1]::int[] AS a1
         ,arr[i][2]::int[] AS b1
   FROM   a, generate_subscripts(a.arr, 1) i       -- using implicit LATERAL
   ) s ON (t.a = ANY(s.a1) OR s.a1 = '{}')
      AND (t.b = ANY(s.b1) OR s.b1 = '{}');

Mungkin lebih cepat, bisakah Anda menguji?

Dalam versi sebelum 9.3 seseorang akan menggunakan CROSS JOIN explicit eksplisit alih-alih penyambungan silang lateral.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Postgres RAISE EXCEPTION diubah menjadi PDOException?

  2. Memilih baris yang diurutkan oleh beberapa kolom dan berbeda di kolom lainnya

  3. Ukuran Tabel Partisi di PostgreSQL 9.0

  4. PostgreSQL INSERT ON CONFLICT UPDATE (upsert) gunakan semua nilai yang dikecualikan

  5. Beberapa generator urutan Hibernate untuk satu entitas dengan PostgreSQL