PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truyền một mảng mảng làm tham số cho một hàm

Tôi thích cách tiếp cận thứ hai của bạn.

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 = '{}')
;

Chỉ đề xuất những cải tiến nhỏ:

  1. Truy vấn con thay vì CTE để có hiệu suất tốt hơn một chút.

  2. Kiểm tra đơn giản cho mảng trống:kiểm tra theo nghĩa đen '{}' thay vì gọi hàm.

  3. Một cấp truy vấn con ít hơn để mở gói mảng.

Kết quả:

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

Đối với người đọc thông thường:Việc bao bọc mảng số nguyên nhiều chiều là cần thiết, vì Postgres yêu cầu điều đó (trích dẫn thông báo lỗi):

Tuyến đường thay thế sẽ là với mảng văn bản 2 chiều và giải nén nó bằng cách sử dụng 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 = '{}');

Có thể nhanh hơn, bạn có thể kiểm tra không?

Trong các phiên bản trước 9.3, người ta sẽ sử dụng CROSS JOIN rõ ràng thay vì nối chéo bên.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lỗi phân đoạn pg.rb [Nâng cấp Mojave]

  2. Sử dụng nhiều lược đồ PostgreSQL với các mô hình Rails

  3. Làm cách nào để sửa đổi hoặc xóa một đối tượng JSON cụ thể khỏi mảng JSON được lưu trữ trong kiểu cột jsonb trong PostgreSQL bằng cách sử dụng mệnh đề where?

  4. Làm cách nào để thực hiện các truy vấn khi kết nối DB trong Rails?

  5. Sử dụng Hibernate với rất nhiều chủ đề