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

Tìm kiếm jsonb postgres trong mảng với toán tử lớn hơn (với jsonb_array_elements)

Thay vì cross join lateral sử dụng where exists :

select *
from documents d
where exists (
  select 1
  from jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil
  where (pil->'AMOUNT'->>'value')::decimal >= 1000)
limit 50;

Cập nhật

Và một phương pháp khác, phức tạp hơn nhưng cũng hiệu quả hơn nhiều.

Tạo hàm trả về giá trị tối đa từ JSONB của bạn dữ liệu, như thế này:

create function fn_get_max_PAYABLE_INVOICE_LINES_value(JSONB) returns decimal language sql as $$
  select max((pil->'AMOUNT'->>'value')::decimal)
  from jsonb_array_elements($1 -> 'PAYABLE_INVOICE_LINES') as pil $$

Tạo chỉ mục trên chức năng này:

create index idx_max_PAYABLE_INVOICE_LINES_value
  on documents(fn_get_max_PAYABLE_INVOICE_LINES_value(data_block));

Sử dụng hàm trong truy vấn của bạn:

select *
from documents d
where fn_get_max_PAYABLE_INVOICE_LINES_value(data_block) > 1000
limit 50;

Trong trường hợp này, chỉ mục sẽ được sử dụng và truy vấn sẽ nhanh hơn nhiều trên một lượng lớn dữ liệu.

Tái bút:Thường limit có ý nghĩa đi đôi với order by .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm postgres ratio_to_report

  2. Dự phòng &Dự phòng cho PostgreSQL trên Microsoft Azure

  3. Postgres - Kéo một bản sao của toàn bộ DB từ một máy chủ từ xa đến máy phát triển cục bộ

  4. MySQL và PostgreSQL? Tôi nên chọn cái nào cho dự án Django của mình?

  5. Cập nhật nhiều hàng trong một bảng từ một bảng khác khi điều kiện tồn tại