MySQL 5.7:将简单的 JSON ARRAY 转换为行

2023-11-25

我有一个带有 JSON_ARRAY 列的简单表,如下所示:

+----+---------+
| id | content |
+----+---------+
|  1 | [3, 4]  |
|  2 | [5, 6]  |
+----+---------+

我想列出特定 id 的所有内容引用

SELECT JSON_EXTRACT(content, '$') as res FROM table WHERE id=1

但我希望结果是成行的:

+-----+
| res |
+-----+
|  3  |
|  4  |
+-----+

您可以在 MySQL 8.0 中执行此操作JSON_TABLE():

select r.res from mytable, 
 json_table(mytable.content, '$[*]' columns (res int path '$')) r 
where mytable.id = 1

我在 MySQL 8.0.17 上进行了测试,这是输出:

+------+
| res  |
+------+
|    3 |
|    4 |
+------+

如果您使用 MySQL 8.0 之前的版本,您有以下选项:

  • 找到一些极其复杂的 SQL 解决方案。这几乎总是解决问题的错误方法,因为您最终会得到维护成本太高的代码。
  • 按原样获取 JSON 数组,并在应用程序代码中分解它。
  • 规范化数据,以便每行都有一个值,而不是使用 JSON 数组。

我经常在 Stack Overflow 上找到有关在 MySQL 中使用 JSON 的问题,这些问题让我相信这个功能已经毁了 MySQL。开发人员继续不恰当地使用它。他们喜欢这样很容易insert半结构化数据,但他们发现它使得querying这些数据太复杂了。


回复 @ChetanOswal 的评论:

MySQL 5.7 有一些解决方案,但它们并不令人满意,我的建议是避免使用它们。

Demo:

我们可以从上面原始问题中显示的数据开始。

mysql> create table mytable (id serial primary key, content json);

mysql> insert into mytable values
    -> (1, '[3,4]'),
    -> (2, '[5,6]');

接下来,我们需要另一个表,它只包含一系列整数值,至少与最长的 JSON 数组一样多。

mysql> create table numbers (number int primary key);

mysql> insert into numbers values (0), (1), (2);

使用不等式连接这些表,我们可以创建与 JSON 数组中的项目数一样多的行。

mysql> select * from mytable 
  join numbers on numbers.number < json_length(mytable.content);
+----+---------+--------+
| id | content | number |
+----+---------+--------+
|  1 | [3, 4]  |      0 |
|  1 | [3, 4]  |      1 |
|  2 | [5, 6]  |      0 |
|  2 | [5, 6]  |      1 |
+----+---------+--------+

现在我们可以使用这些数字作为数组索引来从 JSON 数组中提取值。

mysql> select *, 
  json_extract(mytable.content, concat('$[', numbers.number, ']')) as value 
 from mytable 
 join numbers on numbers.number < json_length(mytable.content);
+----+---------+--------+-------+
| id | content | number | value |
+----+---------+--------+-------+
|  1 | [3, 4]  |      0 | 3     |
|  1 | [3, 4]  |      1 | 4     |
|  2 | [5, 6]  |      0 | 5     |
|  2 | [5, 6]  |      1 | 6     |
+----+---------+--------+-------+

这就是我在 MySQL 5.7 中解决这个问题的建议。

如果您需要 MySQL 8.0 中的功能,那么您应该升级到 MySQL 8.0。

MySQL 5.7 将于 2023 年 10 月即将结束生命。无论如何,是时候升级了。

如果您无法升级,并且您不喜欢我展示的解决方案,那么您应该停止使用 SQL 来处理 JSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 5.7:将简单的 JSON ARRAY 转换为行 的相关文章

  • MySQL 错误“连接过多”

    我正在将 MySQL 5 0 用于由 GoDaddy linux 托管的网站 我正在对我的网络应用程序进行一些测试 突然我注意到页面刷新速度非常慢 最后 经过漫长的等待 我到达了一个页面 上面写着 MySQL 错误 连接太多 它指向我连接到
  • 如何设置 Hibernate 读取/写入不同的数据源?

    使用 Spring 和 Hibernate 我想写入一个 MySQL 主数据库 并从基于云的 Java Web 应用程序中的另一个复制从属数据库中读取数据 我找不到对应用程序代码透明的解决方案 我真的不想更改我的 DAO 来管理不同的 Se
  • 比较两个表并找到匹配的列

    我有两个表 table1 和 table2 我需要编写一个选择查询 它将列出两个表中存在的列 mysql 我需要为不同的桌子做 一次2个 这可能吗 我尝试使用INFORMATION SCHEMA COLUMNS但我无法做对 SELECT a
  • PhpMyAdmin 导出不包括 mysqldump 中的主键

    用PhpMyAdmin导出同一个表的结构 DROP TABLE IF EXISTS test apprentis CREATE TABLE IF NOT EXISTS test apprentis a id smallint 10 NOT
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • phpMyAdmin - #1932 重新安装后表不存在(正在使用排序规则)

    我正在做我的论文 当我发现我的 XAMPP 服务器有一些错误日志时 所以我决定将我的 XAMPP 重新安装到更新的版本 我从 SO 中的一些线程中得 到了这个想法 我移动了我的mysql gt data文件夹并在我的新安装文件夹中再次恢复它
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • 如何使用WAMP登录phpMyAdmin,用户名和密码是什么?

    根 这个词是什么意思php我的管理员 http en wikipedia org wiki PhpMyAdmin 每当我写作时localhost phpmyadmin在地址栏上 我被要求输入用户名和密码 但我不知道它们是什么 我不记得何时何
  • 使用 DataContractJsonSerializer WP7 将数组解析为 Json 字符串

    如何使用 DataContractJsonSerializer 解析 Json 字符串中的数组元素 语法是 array elementsProperies SomeLiteral 您不一定使用 DataContractJsonSeriali
  • 为什么有时自增列的值会有一个或多个间隙?

    我有一个这样的表 colors id color 1 red 2 blue id column is auto increment PK 当我向该表中插入一些新值时 有时会出现一些间隙id柱子 像这样的事情 INSERT INTO colo
  • SESSION 中存储的数组后面出现数字

    我正在对存储在会话变量上的数组执行 print r 由于某种未知的原因 它在数组打印后添加了一个数字 Example Array 0 gt 868 userid gt 868 1 如果我直接在函数本身中执行 print r 并且在变量存储在
  • JS如何获取多维数组的最大深度?

    我有一个多维数组 我想知道它的最大深度 我发现了这个灵魂 但它不适用于对象数组 const getArrayDepth arr gt return Array isArray arr 1 Math max arr map getArrayD
  • int arr[ ] 是有效的 C++ 吗?

    我试图理解是否写作int arr 在 C 中有效 举个例子 int a is this valid extern int b is this valid int ptrB is this valid struct Name int k is
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • shell 脚本中数组的最大元素及其索引

    如何在 shell 脚本中从数组中找到最大元素及其索引 我有一个数组 a 2 2116565098 2 1238242060 2 1747941240 2 3201010162 2 3677779871 1 8126464132 2 124
  • 如何使用 jQuery 获取数组键?

    下午好 我有一个数组 其中包含一些键和值 然后我需要获取数组键而不是其中的数据 我想用 jQuery 来做到这一点 例如 我知道 PHP 有一个名为 array keys 的函数 它将数组作为参数 并返回一个数组 其中包含每个索引中的每个键
  • Excel VBA 将范围值复制到数组,

    我有以下代码摘录 我试图将一系列值复制到声明的数组上 但它一直给我 无法分配给数组 错误 Dim permittedCurve 0 To 7000 As Variant permittedCurve activeWorkbook Works
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M

随机推荐

  • Angularjs 资源 query() 结果数组作为属性

    我喜欢这样的方式query 方法返回一个资源数组 可以再次保存到服务器 我正在尝试使用 Angular 来对抗Drupal RestWS模块 它返回一个具有多个 元 属性的对象和一个名为 list 的属性 其中存储实际数据 有没有办法告诉资
  • 如何读取当前页面URL的#hash(或片段标识符)?

    如果我在https www website com something 如何返回哈希值 something 从网址 window location hash就这么简单 不要使用所有消耗CPU并影响性能的方法 如果 DOM 提供了一些预定义的
  • 如何使用特定的假“事件”参数调用triggerHandler?

    我正在尝试测试在链接上单击 preventDefault 是否被调用 然而 我很难用我可以监视的对象替换真正的 事件 对象 下面是我触发点击事件的方法 var e jasmine createSpyObj e preventDefault
  • 如何仅在匹配时使用 sed 有条件地删除第一行?

    我可以用吗sed检查某些命令的输出 到标准输出 的第一行 并在它与特定模式匹配时删除第一行 比如说 命令的输出是这样的 AB CD E F 我希望它变成 CD E F 但是当第一行是 GH 我不想删除该行 我尝试了这个 但它不起作用
  • javascript:带有回调和“this”的原型

    我创建了一个基于原型的类Person打开 WebSocket 连接并将回调函数定义为原型方法 因为在回调里面this将引用 WebSocket 对象 我使用另一个变量来保存Person s this 但是 当我处理多个实例时 变量会被覆盖
  • 使具有特定颜色的图像的每个像素透明

    我有一个 System Drawing Image 类型的对象 并且想要使每个像素具有某种特定颜色 例如黑色 透明 即 将该像素的 alpha 设置为 0 做这个的最好方式是什么 一种好的方法是使用图像属性类设置一个颜色列表 以便在绘图时重
  • JavaScript 使用 && 运算符代替 if 条件

    像这样的逻辑运算符有什么意义 r 0 r i function do var r 0 var i 10 r 0 r i 这与 相同吗 if r 0 r i 总是对我有帮助的是将其翻译成文字 var r 0 var i 10 r 0 r i
  • Python请求GET需要很长时间才能响应某些请求

    我在用Python 请求get方法来查询媒体维基API 但需要很长时间才能收到回复 相同的请求通过网络浏览器非常快地收到响应 我在请求 google com 时遇到同样的问题 以下是我在 Windows 10 上的 Python 3 5 中
  • 如何测试一个函数在react jest中被调用?

    我的按钮位于组件内 该按钮在单击时调用方法deleteData 如何测试在单击按钮时调用deleteData 方法
  • 如何在模拟器中显示测试 IAd 横幅

    大家好 我导入了 iAd 框架并为 iAd 实现了代码 我的示例代码如下所示 h file import
  • 无法获取提供程序 com.google.android.gms.ads.MobileAdsInitProvider:java.lang.IllegalStateException

    我将 Android Studio 3 2 1 及其 sdk 更新到最新版本 之后 需要通过添加以下标签来手动更新清单
  • Django 访问表单集数据

    我无法访问通过表单集提交的数据 这是我的代码 模板
  • C# - 关闭 Sql 对象最佳实践

    如果您有一个带有 Sqlaccess 的 C 函数 是否必须关闭所有对象 句柄 或者退出该函数后所有内容都会自动清除 例如 void DoSqlStuff SqlConnection sqlConn new SqlConnection Sq
  • 如何解释铬火焰图中的间隙

    我试图更好地理解如何解释铬火焰图 在下面的图表中 changeHandler显示为四个不同的块 但我知道事实上它只被调用一次 我在这里看到了一个类似的问题 声称这可能是一个错误 但那是四年前的事了 Chrome devtools 配置文件火
  • 获取双 SIM 卡手机中的两个 SIM 卡运营商名称

    我想知道当手机是双卡时两个 SIM 卡的运营商名称 在单 SIM 卡中 我以编程方式获得运营商名称 但对于双 SIM 卡 我不能 尽管经过如此多的搜索和尝试 如果我在双 SIM 卡手机中运行我的应用程序 那么我可以在我的应用程序中获取两个
  • 如何使用brew链接到新的gcc版本?

    我刚刚通过运行获得了新的 gcc 版本brew update and brew upgrade 布鲁尔抱怨说brew link没有成功完成 brew upgrade gt Upgrading 1 outdated package with
  • 用户定义的不带下划线的文字

    根据参考参数可以使用定义文字 CSomeClass operator s const char literal size t size 现在读完该段落后我认为应该也可以定义 CSomeClass operator r const char
  • Android USB设备权限和意图过滤器

    我有一个 Android 应用程序 它将与 USB 设备交互 在Android 开发者官方文档获取与设备通信的权限它说 Note 如果您的应用程序使用 Intent 过滤器来发现连接的 USB 设备 那么当用户允许您的应用程序处理该 Int
  • lock 语句的开销有多大?

    我一直在尝试多线程和并行处理 我需要一个计数器来对处理速度进行一些基本计数和统计分析 为了避免并发使用类时出现问题 我在类中的私有变量上使用了锁定语句 private object mutex new object public void
  • MySQL 5.7:将简单的 JSON ARRAY 转换为行

    我有一个带有 JSON ARRAY 列的简单表 如下所示 id content 1 3 4 2 5 6 我想列出特定 id 的所有内容引用 SELECT JSON EXTRACT content as res FROM table WHER