Comment sélectionner les enregistrements à partir d'une Postgres table à l'aide d'une COMMANDE PAR une instruction sur un jsonb colonne qui pointe vers une autre table

0

La question

J'ai deux tables, characteristics et students.

caractéristiques

 id      name          value
----    ------        -------
 1      country       england
 2      country       brazil
 3      games         football
 4      games         baseball
 5      country       india
 .        .             .
 .        .             .

les étudiants

 first_name      age       character_values
------------    -----     ------------------
  Jason          12         [1,4]
  Mark           14         [1,3] 
  Kunal          10         [5,3] 
   .              .           .
   .              .           .
   .              .           .

L' characteristics table a trois colonnes, où l' id la colonne est un champ à incrémentation automatique. L' name désigne le nom d'une caractéristique spécifique et l' value indique les informations au sujet de la caractéristique.

L' students le tableau contient des détails à propos de chaque étudiant. L' character_value dans le champ students le tableau est un jsonb champ. Chaque élément de la jsonb tableau est un code qui pointe vers le caractère approprié de l'ID dans l' characteristics table.

(par exemple, si un étudiant est originaire du pays de l'inde puis l'ID 5 est ajouté à character_values jsonb tableau contre le nom de l'étudiant)

En supposant que chaque étudiant ne peut appartenir qu'à un seul pays, comment puis-je sélectionner une liste d'étudiants lors de la commande par le nom du pays qu'ils appartiennent?

database jsonb postgresql sql
2021-11-21 18:58:49
1

La meilleure réponse

1

Vous pouvez joindre les tables avec jsonb_array_elements:

select c.*, s.first_name from characteristics c join students s on exists 
  (select 1 from jsonb_array_elements(s.character_values) v where v.value::int = c.id)

Sortie:

id nom valeur prenom
1 pays l'angleterre Jason
1 pays l'angleterre Marque
3 jeux football Marque
3 jeux football Kunal
4 jeux baseball Jason
5 pays l'inde Kunal
2021-11-21 19:12:50

Pourquoi avez-vous utilisé une sélection de 1 au lieu de SELECT *? Aucune raison spécifique?
Vinay

@Vinay select 1 est convention pour exists les sous-requêtes.
Ajax1234

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................