How to get values from MySQL(5.6) column if that contains json document as string

前端 未结 10 692
萌比男神i
萌比男神i 2020-12-02 18:48

How to get values from MySQL(5.6) column if that contains JSON document as a string

For example, if we have a table - employee in that we have three columns id, nam

相关标签:
10条回答
  • 2020-12-02 19:37

    Below answer works for me. it remove double quotes from the value.

    DELIMITER $$
    
    DROP FUNCTION IF EXISTS `json_extract_values`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `json_extract_values`(
      details TEXT,
      required_field VARCHAR (255)
    ) RETURNS TEXT CHARSET latin1
    BEGIN
    SET details = SUBSTRING_INDEX(details, "{", -1);
    SET details = SUBSTRING_INDEX(details, "}", 1);
    RETURN 
        SUBSTRING_INDEX(
            TRIM(
                TRAILING '"' FROM 
                    SUBSTRING_INDEX(
                        details,
                        CONCAT( 
                               '"', 
                               SUBSTRING_INDEX(required_field,'$.', - 1),
                               '":'
                              ),
                    -1 )
                ),
            '"',
         -1);    
    END$$
    
    DELIMITER ;
    
    0 讨论(0)
  • 2020-12-02 19:40

    To be able to do what you want to, you need MySQL 5.7.8+. Since 5.7.8 you can use JSON_EXTRACT function to extract a value from a JSON string:

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

    Taken from here.

    In MySQL 5.6 you just can't get the value you want as MySQL doesn't know anything about what a JSON object is. So your options are:

    • Upgrade to 5.7.8+
    • Parse the query result with something that handles JSON:
      • Could be PHP json_decode (or equivalent in your language)
      • An online tool like http://json.parser.online.fr/
    0 讨论(0)
  • 2020-12-02 19:45

    Both previous answers didn't work for me when the element wasn't mentioned in JSON text. There is my improved function:

    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 ;
    
    0 讨论(0)
  • 2020-12-02 19:46

    In MySQL 5.6, by default JSON_EXTRACT is not available by default.
    If you still need to access json data in MySQL 5.6, you need to write custom function.

    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 ;
    

    This will help. I have created it and tested.

    0 讨论(0)
提交回复
热议问题