如何在 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 中选择值的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中从json中只选择一项

如何在 php foreach 循环中从 json obj 获取值

如何在 Vue.js 中从 JSON 数据创建选择元素?

如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?

如何在java中从逗号分隔的字符串值创建一个json?

如何在本机反应中从平面列表中设置 Json 数组