如何在 mysql 中从 JSON 中选择值
Posted
技术标签:
【中文标题】如何在 mysql 中从 JSON 中选择值【英文标题】:How to select values from JSON in mysql 【发布时间】:2019-03-26 13:56:40 【问题描述】:您好,谁能告诉我这个查询有什么问题。
DECLARE @json LONGTEXT;
SET @json = '[ "name":"John Smith", "address":"780 Mission St, San Francisco, CA 94103", "name":"Sally Brown", "address":"75 37th Ave S, St Cloud, MN 94103", "name":"John Johnson", "address":"1262 Roosevelt Trail, Raymond, ME 04071" ]';
##SELECT @json;
SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
name VARCHAR(40) PATH '$.name',
address VARCHAR(100) PATH '$.address'));
我得到的错误是
您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 靠近 '(@json, '$[*]' 列 ( 名称 VARCHAR(40) 路径 '$.name', ' 在第 1 行
仅供参考,我使用 TOAD 作为工具连接到我的云我的 sql 实例。
【问题讨论】:
不知道您是否收到错误或未获得预期结果? @RaymondNijland:更新了问题。 检查我的答案我认为这会有所帮助,就像我已经说过你需要编写棘手的 MySQL 代码一样。 【参考方案1】:首先,在这种情况下,在 mysql 中您不需要声明变量。只需使用“SET”关键字。最后,您需要为“选择”查询添加别名。像这样:
SET @json = '[ "name":"John Smith", "address":"780 Mission St, San Francisco, CA 94103", "name":"Sally Brown", "address":"75 37th Ave S, St Cloud, MN 94103", "name":"John Johnson", "address":"1262 Roosevelt Trail, Raymond, ME 04071" ]';
##SELECT @json;
SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
`name` VARCHAR(40) PATH '$.name',
`address` VARCHAR(100) PATH '$.address')) AS T;
【讨论】:
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '(@json, '$[*]' COLUMNS (name
VARCHAR(40) PATH '$.name', ' at line 1跨度>
它确实有效@Sumit 请参阅demo.. 如果出现此错误。那么您不要在 MySQL 8 版本上执行此操作,您将不得不模拟/模拟 JSON_TABLE()
函数。
@RaymondNijland:是的,错误是版本。我使用的 MySQL 版本是 5.7,而 JSON_TABLE 在 8 中工作。有什么建议可以让它在 5.7 中工作吗??
“任何建议如何让它在 5.7 中工作” 是的,我可能会@Sumit,但你不会喜欢它,它涉及编写棘手的 MySQL 代码。跨度>
@RaymondNijland:我的主要问题是我想使用 C# 在我的 sql 中批量插入数据。这就是我要解决的问题。【参考方案2】:
理想情况下你应该升级到 MYSQL 8,这个答案更多的是为了好玩
您需要编写棘手的 SQL 来模拟/模拟 MySQL 8 以下版本中的 MySQL 8.0 JSON_TABLE()
查询
SET @json = '[ "name":"John Smith", "address":"780 Mission St, San Francisco, CA 94103", "name":"Sally Brown", "address":"75 37th Ave S, St Cloud, MN 94103", "name":"John Johnson", "address":"1262 Roosevelt Trail, Raymond, ME 04071" ]';
##SELECT @json;
SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
`name` VARCHAR(40) PATH '$.name',
`address` VARCHAR(100) PATH '$.address')) AS T;
结果
| name | address |
| ------------ | --------------------------------------- |
| John Smith | 780 Mission St, San Francisco, CA 94103 |
| Sally Brown | 75 37th Ave S, St Cloud, MN 94103 |
| John Johnson | 1262 Roosevelt Trail, Raymond, ME 04071 |
见demo
MySQL 的 5.7 模拟/仿真查询涉及使用数字生成器和多个原生 MySQL 的 JSON 函数。
查询
SELECT
REPLACE(JSON_EXTRACT(json_record.json, CONCAT('$[',number,'].name')), '"', '') AS name
, REPLACE(JSON_EXTRACT(json_record.json, CONCAT('$[',number,'].address')), '"', '') AS address
FROM (
SELECT
@row := @row + 1 AS number
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := -1
) init_user_params
) AS number_generator
CROSS JOIN (
SELECT
JSON_LENGTH(json_information.json) - 1 AS json_length
, json_information.json
FROM (
SELECT
record.json
FROM (
SELECT
'
[
"name": "John Smith",
"address": "780 Mission St, San Francisco, CA 94103"
,
"name": "Sally Brown",
"address": "75 37th Ave S, St Cloud, MN 94103"
,
"name": "John Johnson",
"address": "1262 Roosevelt Trail, Raymond, ME 04071"
]
' AS json
FROM
DUAL
) AS record
) AS json_information
) AS json_record
WHERE
number BETWEEN 0 AND json_length
结果
| name | address |
| ------------ | --------------------------------------- |
| John Smith | 780 Mission St, San Francisco, CA 94103 |
| Sally Brown | 75 37th Ave S, St Cloud, MN 94103 |
| John Johnson | 1262 Roosevelt Trail, Raymond, ME 04071 |
见demo
【讨论】:
坦白说升级到 MySQL 8.0 更容易。 我必须同意比尔的观点,但这是一段很好的编码。 “我必须同意 Bill 的观点,但这是一段很好的编码” @Nick 谢谢我也确实升级到 MySQL 8 是最明智的,你注意到了吗 -> “理想情况下,您应该升级到 MYSQL 8,这个答案更多的是为了玩得开心” @RaymondNijland 是的,看到了那个评论。有时您需要玩得开心。以上是关于如何在 mysql 中从 JSON 中选择值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 php foreach 循环中从 json obj 获取值