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

Pencarian jsonb postgres dalam array dengan operator yang lebih besar (dengan jsonb_array_elements)

Alih-alih cross join lateral gunakan 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;

Perbarui

Dan metode lain, lebih kompleks tetapi juga jauh lebih efisien.

Buat fungsi yang mengembalikan nilai maksimal dari JSONB Anda datanya seperti ini:

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 $$

Buat indeks pada fungsi ini:

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

Gunakan fungsi dalam kueri Anda:

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

Dalam hal ini indeks akan digunakan dan kueri akan jauh lebih cepat pada sejumlah besar data.

PS:Biasanya limit memiliki arti yang disandingkan dengan 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. Menggunakan pyspark untuk terhubung ke PostgreSQL

  2. Bagaimana Random() Bekerja di PostgreSQL

  3. Kesalahan Pycharm:Tidak dikonfigurasi dengan benar

  4. Potong string setelah kemunculan karakter pertama

  5. perintah ifelse &grepl saat menggunakan dplyr untuk operasi SQL in-db