mysql - 使用 SQL 将 json 数据列表字段转换为列

标签 mysql sql arrays json mariadb

目前,我的数据库(mariaDB)中有一个名为 data 的列,其中包含一个 json 列表:

ID   | data
1    | '["section1","section2","section3"]'
2    | '["section2","section4"]'

我想把它变成这样:

id   | section1     | section2     | section3         | section4
1    | 1            | 1            | 1                | 0
2    | 0            | 1            | 0                | 1

这意味着所有字段中的所有可能值都会成为列,如果该行相应的列表项存在,则获取值 1;如果不存在,则获取值 0

有什么方法可以通过查询来转换它吗?

最佳答案

SELECT 
    id, 
    JSON_LENGTH(JSON_SEARCH(data, 'all', 'section1')) section1, 
    JSON_LENGTH(JSON_SEARCH(data, 'all', 'section2')) section2, 
    JSON_LENGTH(JSON_SEARCH(data, 'all', 'section3')) section3, 
    JSON_LENGTH(JSON_SEARCH(data, 'all', 'section4')) section4 
from test;

如果您需要零而不是 NULL,请使用 COALESCE() 包装表达式。

如果单独的data值不能包含重复的值(这是由根据约束提供的),或者如果您不需要值数量,但只有它们存在,您可以使用

select 
    id, 
    JSON_CONTAINS(data, '"section1"') section1, 
    JSON_CONTAINS(data, '"section2"') section2, 
    JSON_CONTAINS(data, '"section3"') section3, 
    JSON_CONTAINS(data, '"section4"') section4 
from test;

fiddle

PS。如果可能的 sectionX 值列表是不确定的或动态的,那么您必须使用带有动态 SQL 的存储过程。

关于mysql - 使用 SQL 将 json 数据列表字段转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63897414/

相关文章:

mysql - 如何在命令行上获取 mysql select 查询的树状输出?

php - PHP在数据库中找不到用户名

c# - 这运行缓慢是因为它在 LINQ 中,还是因为我做得不好?

mysql - 如何在mysql中获取数据前4条记录

javascript - 如何从单个 GeoJSON 属性创建值数组?

arrays - Swift UITableView 每 10 个单元格显示不同的单元格

php - 如何将 php 数组中的 null 值转换为空字符串?

mysql - 如何在Sequelize中查询多对多关系数据

PHP MySQL 排序多维数组

java - JAVA 中的 SQL 查询。喜欢命令