如何选择记录从Postgres表使用了通过发表声明一jsonb列指向另一个表

0

的问题

我有两个表, characteristicsstudents.

特点

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

学生

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

characteristics 表三列在那里的 id 列是一个自动增加的领域。 的 name 表示对名称的特定的特征和 value 指示各自的信息有关的特征。

students 表包含详细的关于每一个学生。 的 character_valuestudents 表a jsonb 领域。 每个元素的jsonb阵列是一个ID指向的适当特征ID characteristics 表。

(例如,如果一个学生是从印度的国家则ID5附于 character_values jsonb列针对各个学生的名字)

假定每个学生只能属于一个国家,我怎么选择的学生名单,同时订购的结果通过该国的名称他们属于哪一种?

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

最好的答案

1

你可以加入表 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)

输出:

id 名称 first_name
1 英格兰 Jason
1 英格兰 标记
3 游戏 足球 标记
3 游戏 足球 Kunal
4 游戏 棒球 Jason
5 印度 Kunal
2021-11-21 19:12:50

为什么你使用一个选择1,而不是选择*? 任何具体的原因?
Vinay

@维奈 select 1 是公约》 exists 子查询。
Ajax1234

其他语言

此页面有其他语言版本

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