es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo realizar operaciones adecuadas en JSONB PostgresSQL.

Digamos que tengo

sequelize.query('SELECT associations FROM users WHERE id = :id')

associations es una columna JSONB ARRAY

La salida se vería así

[
{
"role": 2,
"shop_id": 1,
"admin_id": 1,
"manager_id": null
}
]

Me gustaría recorrer el array y buscar esas asociaciones utilizando esos ids

Me gustaría realizar todo eso en la misma consulta.

Tengo una tabla de roles, tabla de tiendas, tabla de usuarios

enter image description here

Progreso
enter image description here
todas las columnas están saliendo como nulas

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para buscar esas asociaciones utilizando los IDs en el array JSONB, puedes usar jsonb_array_elements proporcionado por PostgreSQL. Aquí tienes un ejemplo de consulta para lograr esto:

    SELECT r.name AS role_name, s.name AS shop_name, u.username AS admin_name, u2.username AS manager_name
    FROM users u
    LEFT JOIN jsonb_array_elements(u.associations) a ON true
    LEFT JOIN role r ON a->>'role'::text = r.id::text
    LEFT JOIN shop s ON a->>'shop_id'::text = s.id::text
    LEFT JOIN users u2 ON a->>'manager_id'::text = u2.id::text
    WHERE u.id = :id
    

    Esta consulta selecciona las columnas name de las tablas role y shop, y la columna username dos veces de la tabla users (para admin y manager). Utiliza jsonb_array_elements para unir cada asociación en el array JSONB y luego las relaciona con los IDs en las tablas relacionadas.

    Ten en cuenta que se utiliza a->>'role'::text, a->>'shop_id'::text y a->>'manager_id'::text para extraer los valores del objeto JSONB como texto y compararlos con los IDs en las tablas relacionadas. Además, se utiliza LEFT JOIN para incluir las asociaciones que pueden no tener registros correspondientes en las tablas relacionadas.

    Puedes ejecutar esta consulta utilizando sequelize.query y pasando el parámetro :id. Devolverá los registros coincidentes para las asociaciones en el array JSONB.

Comments are closed.