Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

177
Vistas
Postgres accessing JSONB elements in efficient way

I have batch_table table, which contain batchid type of serial int and data type of JSONB, I indexed data column using GIN,

batchid | data
---------------------------------------------
1  | [{"year":2000,"productid":[21, 32, 5]}]
2  | [{"year":2001,"productid":[21, 39, 5]},{"year":2000,"productid":[1, 25, 5]}]
3  | NULL
4. | [{"year": 2000,"productid":[5]}

Now I want to get batchid by using following requirements
1. year = 2000 & productid= 5
2. year = 2000 & productid= (21 or 5)
3. year = 2000 & productid= (21 & 5)

and I tried this

SELECT batchid FROM batch_table WHERE (data->>'year')::int = 2000 AND (data->>'productid')::int = 5;

with AND & OR for other queries

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

You can use the containment operator @> to search in jsonb (this can even use your index):

1.

select *
from   batch_table
where  data @> '[{"year":2000,"productid":[5]}]';

2.

select *
from   batch_table
where  data @> '[{"year":2000,"productid":[21]}]'
or     data @> '[{"year":2000,"productid":[5]}]';

3.

Depending on your needs, you can use one of these:

  • These will select rows, where year=2000 with productid=21 are in the same object and year=2000 with productid=5 are in the same object (but these objects can be different ones).

    select *
    from   batch_table
    where  data @> '[{"year":2000,"productid":[21]}]'
    and    data @> '[{"year":2000,"productid":[5]}]';
    
    select *
    from   batch_table
    where  data @> '[{"year":2000,"productid":[21]},{"year":2000,"productid":[5]}]';
    
  • This will select rows, where year=2000 with productid=21 are in the same object as well as productid=5

    select *
    from   batch_table
    where  data @> '[{"year":2000,"productid":[21, 5]}]';
    

http://rextester.com/ZMCUME18642

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda