首页 > 解决方案 > 如何在 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 查询中选择指定的属性?

标签: mysqlsqljsonselect

解决方案


如果您使用的是 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,而不是将这些对象存储为具有普通列的行。


推荐阅读