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

Làm thế nào để truy cập chỉ mục nội bộ mảng với postgreSQL?

PostgreSQL không cung cấp các hàm chuyên dụng để tạo chỉ số con mảng:

WITH   x(a) AS ( VALUES ('{1,20,3,5}'::int[]) )
SELECT generate_subscripts(a, 1) AS idx
      ,unnest(a) AS val
FROM   x;

Về hiệu quả, nó hoạt động gần giống như truy vấn của @ Frank, chỉ không có truy vấn con.
Thêm vào đó, nó hoạt động với các chỉ số con không bắt đầu bằng 1 .

Một trong hai giải pháp hoạt động cho 1 chiều chỉ mảng! (Có thể dễ dàng mở rộng thành nhiều chiều.)

Chức năng:

CREATE OR REPLACE FUNCTION unnest_with_idx(anyarray) 
RETURNS TABLE(idx integer, val anyelement) LANGUAGE SQL IMMUTABLE AS
$func$
  SELECT generate_subscripts($1, 1), unnest($1);
$func$;

Gọi:

SELECT * FROM unnest_with_idx('{1,20,3,5}'::int[]);

Cũng xem xét:

SELECT * FROM unnest_with_idx('[4:7]={1,20,3,5}'::int[]);

Tìm hiểu thêm về chỉ số mảng trong câu hỏi liên quan này.

Nếu bạn thực sự muốn các đăng ký được chuẩn hóa (bắt đầu bằng 1), tôi sẽ sử dụng:

SELECT generate_series(1, array_length($1,1)) ...

Đó gần như là truy vấn bạn đã có, chỉ với array_length() thay vì array_upper() - sẽ không thành công với các chỉ số phụ không chuẩn.

Hiệu suất

Tôi đã chạy thử nghiệm nhanh trên một mảng 1000 int với tất cả các truy vấn được trình bày ở đây cho đến nay. Tất cả chúng đều hoạt động giống nhau (~ 3,5 mili giây) - ngoại trừ row_number() trên một truy vấn con (~ 7,5 mili giây) - như mong đợi, vì truy vấn con.

Cập nhật:Postgres 9.4+

Trừ khi bạn thao tác với các đăng ký chỉ mục không chuẩn, hãy sử dụng WITH ORDINALITY mới thay vào đó:

  • PostgreSQL unnest () với số phần tử


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dplyr left_join nhỏ hơn, lớn hơn điều kiện

  2. Đo lường thống kê điểm kiểm tra PostgreSQL

  3. sự khác biệt giữa localhost và postgres cho máy chủ trong docker

  4. Ràng buộc bảng chéo trong PostgreSQL

  5. Dấu hai chấm (::) ký hiệu trong SQL