我正在使用Postgres服务器。这是我的桌子的外观
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS85cWp4OS5wbmcifQ==” alt =“这里是我的表格。”>
这意味着每部电影的类型列均采用以下格式:
[
{'id': 18, 'name': 'Drama'},
{'id': 36, 'name': 'History'},
{'id': 10749, 'name': 'Romance'}
]
您可以看到每部电影的流派都在VARCHAR
变量和JSON数组中。
我想做的是解压JSON的内容,并创建一个名为Genres
的新表,该表将使用其唯一ID来对每种流派都使用一次。
所以对于上面的示例,我希望新表看起来像这样:
id | genre
18 | 'Drama'
36 | 'History'.
我该怎么做?
您应该明确地修复您的架构,并将JSON数据存储为JSON[B]
数据类型而不是字符串。
就是说,一种选择是强制转换为json,这样我们便可以使用Postsgres强大的json函数取消嵌套数组并访问内部对象。就您的数据显示而言,您只需将单引号变为双引号即可使字符串有效为Postgres JSON,因此应该可以:
insert into genres(id, genre)
select distinct js ->> 'id', js ->> 'name'
from mytable t
cross join lateral jsonb_array_elements( (replace(genres, ''', '"'))::jsonb ) j(js)