首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果包含字符串形式的json文档,如何从MySQL(5.6)列中获取值

如果包含字符串形式的json文档,如何从MySQL(5.6)列中获取值
EN

Stack Overflow用户
提问于 2016-06-14 23:28:25
回答 13查看 65.5K关注 0票数 33

如果包含字符串形式的MySQL文档,如何从JSON (5.6)列中获取值

例如,如果我们有一个表- employee,我们有三个列id、name和educations。和列教育包含JSON文档形式的数据

代码语言:javascript
复制
{"ug":"bsc","pg":"mca","ssc":"10th"}

我需要教育栏目中的ug和pg的值

我们可以使用MySQL(5.6)查询做到这一点吗?

EN

回答 13

Stack Overflow用户

发布于 2016-06-14 23:51:30

为了能够做你想做的事情,你需要MySQL 5.7.8+。从5.7.8开始,您可以使用JSON_EXTRACT函数从JSON字符串中提取一个值:

代码语言:javascript
复制
SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');

+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan"                                               |
+---------------------------------------------------------+

摘自here

在JSON5.6中,你不能得到你想要的值,因为MySQL不知道什么是MySQL对象。所以你的选择是:

  • Upgrade to 5.7.8+
  • 使用处理JSON的工具解析查询结果:
    • 可以是PHP json_decode (或在您的语言中的等效语言)
    • 在线工具,如JSON

票数 24
EN

Stack Overflow用户

发布于 2017-05-19 18:03:50

在MySQL 5.6中,默认情况下JSON_EXTRACT不可用。

如果您仍然需要在MySQL 5.6中访问json数据,则需要编写自定义函数。

代码语言:javascript
复制
DELIMITER $$

DROP FUNCTION IF EXISTS `json_extract_c`$$

CREATE DEFINER=`root`@`%` FUNCTION `json_extract_c`(
  details TEXT,
  required_field VARCHAR (255)
) RETURNS TEXT CHARSET latin1
BEGIN
  RETURN TRIM(
    BOTH '"' FROM SUBSTRING_INDEX(
      SUBSTRING_INDEX(
        SUBSTRING_INDEX(
          details,
          CONCAT(
            '"',
            SUBSTRING_INDEX(required_field,'$.', - 1),
            '"'
          ),
          - 1
        ),
        '",',
        1
      ),
      ':',
      - 1
    )
  ) ;
END$$

DELIMITER ;

这将会有所帮助。我已经创建了它并进行了测试。

票数 20
EN

Stack Overflow用户

发布于 2017-09-07 14:30:25

当JSON文本中没有提到该元素时,上述两个答案对我都不起作用。这是我改进后的函数:

代码语言:javascript
复制
DELIMITER $$

DROP FUNCTION IF EXISTS `json_extract_c`$$

CREATE FUNCTION `json_extract_c`(
details TEXT,
required_field VARCHAR (255)
) RETURNS TEXT CHARSET latin1
BEGIN
  DECLARE search_term TEXT;
  SET details = SUBSTRING_INDEX(details, "{", -1);
  SET details = SUBSTRING_INDEX(details, "}", 1);
  SET search_term = CONCAT('"', SUBSTRING_INDEX(required_field,'$.', - 1), '"');
  IF INSTR(details, search_term) > 0 THEN
    RETURN TRIM(
      BOTH '"' FROM SUBSTRING_INDEX(
        SUBSTRING_INDEX(
          SUBSTRING_INDEX(
            details,
            search_term,
            - 1
          ),
          ',"',
          1
        ),
        ':',
        -1
      )
    );
  ELSE
    RETURN NULL;
  END IF;
END$$

DELIMITER ;
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37816269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档