mysql - 如何在 SQL 语句中选择 JSON 属性?
问题描述
我有 json 类型的字段。示例值为:
[{"id": "960287", "src_ip": "X.X.X.X", "filename": "XXX-20200408092811-0", "order_id": "199926", "download_ip": "", "datetime_add": "2020-04-09 09:16:48", "order_desk_id": null, "datarejestracji": null, "download_browser": "", "datetime_download": "0000-00-00 00:00:00"}, {"id": "960288", "src_ip": "2.128.4.33", "filename": "XXX-20200408101526-4", "order_id": "199926", "download_ip": "", "datetime_add": "2020-04-09 09:16:48", "order_desk_id": null, "datarejestracji": null, "download_browser": "", "datetime_download": "0000-00-00 00:00:00"}, {"id": "960751", "src_ip": "2.128.4.33", "filename": "20200409164205-24", "order_id": "199926", "download_ip": "", "datetime_add": "2020-04-09 20:02:46", "order_desk_id": null, "datarejestracji": null, "download_browser": "", "datetime_download": "0000-00-00 00:00:00"}]
如何在 SQL 查询中选择指定的属性?
解决方案
如果您使用的是 MySQL 5.7 或更高版本,则可以使用 JSON_EXTRACT() 函数:
SELECT JSON_EXTRACT(myjsoncolumn, '$[0].src_ip') AS src_ip
FROM mytable;
还有一个速记语法:
SELECT myjsoncolumn->'$[0].src_ip' AS src_ip
FROM mytable;
请注意,此函数返回 JSON,而不是标量字符串值,因此它看起来像"X.X.X.X"
带有引号。如果您想要原始值,请使用:
SELECT JSON_UNQUOTE(JSON_EXTRACT(myjsoncolumn, '$[0].src_ip')) AS src_ip
FROM mytable;
或简写:
SELECT myjsoncolumn->>'$[0].src_ip' AS src_ip
FROM mytable;
阅读有关 JSON 函数的文档以获取更多信息:https ://dev.mysql.com/doc/refman/8.0/en/json-functions.html
如果您至少没有使用 MySQL 5.7,则应该升级。旧版本现在已经过时了,如果您将 JSON 数据存储在数据库中,除了将整个 JSON 文档返回给客户端之外,将很难做任何事情。
鉴于您的示例 JSON 的结构,我认为您可能需要使用JSON_TABLE()。
看起来您有一个具有相同字段的 JSON 对象数组,所以我想知道您为什么要使用 JSON,而不是将这些对象存储为具有普通列的行。
推荐阅读
- react-native - 我们可以在 WebView 中使用 react-navigation 的导航道具吗?
- c# - 等待元素,但元素始终存在 (POM)
- bash - 如何在 shell 脚本中通过 SSH 运行函数和本地资源
- flask - 如何使用 jinja2 对烧瓶中的某些值进行分组?
- ios - 当单元格具有动态宽度时,CollectionView 中的间距不正确?
- c# - 我应该使用我的对象作为字典键值还是连接字符串
- laravel - 如何在 Laravel 验证中忽略软删除字段并检查唯一值?
- php - PHP Doctrine MongoDB ODM 中的鉴别器字段冲突是什么?
- parsing - 对多行 ANTLR 重复相同的规则
- python - PyCharm 报告错误的 Python 版本