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

前端 未结 10 720
萌比男神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:33

    Function above not work properly if you have nested JSON in table field.

    Because i needed a JSON_EXTRACT on mysql 5.6 i wrote it by myself a copy of original function that can extract values like the native function in mysql 5.7

    Usage:

    SELECT JSON_EXTRACT_NESTED(table_field,"json_level1.json_level2.json_level3") FROM table;
    

    If you have one level JSON then you use:

    SELECT JSON_EXTRACT_NESTED(table_field,"json_level1") FROM table;
    

    In database you have to add two functions:

    Main function:

    CREATE FUNCTION `json_extract_nested`(
    _field TEXT,
    _variable TEXT
    ) RETURNS TEXT CHARSET latin1
    BEGIN
                    DECLARE X INT DEFAULT 0;
                    DECLARE fieldval1 TEXT;
                    DECLARE arrayName,arrayValue TEXT;
    
                    SET arrayName = SUBSTRING_INDEX(_variable, '.', 1);
    
                    IF(LOCATE('%',arrayName)> 0) THEN 
                        SET _field = SUBSTRING_INDEX(_field, "{", -1);
                        SET _field = SUBSTRING_INDEX(_field, "}", 1);
                        RETURN TRIM(
                        BOTH '"' FROM SUBSTRING_INDEX(
                            SUBSTRING_INDEX(
                            SUBSTRING_INDEX(
                                _field,
                                CONCAT(
                                '"',
                                SUBSTRING_INDEX(_variable,'$.', - 1),
                                '":'
                                ),
                                - 1
                            ),
                            ',"',
                            1
                            ),
                            ':',
                            -1
                        )
                        ) ;
                    ELSE  
                        SET arrayValue = json_array_value(_field, arrayName);
                        WHILE X < (LENGTH(_variable) - LENGTH(REPLACE(_variable, '.', ""))) DO
                            IF(LENGTH(_variable) - LENGTH(REPLACE(_variable, '.', ""))>X) THEN
                                SET arrayName = SUBSTRING_INDEX(SUBSTRING_INDEX(_variable, '.', X+2),'.',-1);
                            END IF;
                            IF(arrayName<>'') THEN
                                SET arrayValue = json_array_value(arrayValue, arrayName);
                            END IF;
                            SET X = X + 1;
                        END WHILE;
                    END IF;
                    RETURN arrayValue;
                    END$$
    DELIMITER ;
    

    Auxiliary function (needed by main function):

    CREATE FUNCTION `json_array_value`(
      _field  TEXT,
      arrayName VARCHAR (255)
    ) RETURNS TEXT CHARSET latin1
    BEGIN
                    DECLARE arrayValue, arrayValueTillDelimit TEXT;
                    DECLARE arrayStartDelimiter, arrayEndDelimiter VARCHAR(10);
                    DECLARE arrayCountDelimiter INT;
                    DECLARE countBracketLeft, countBracketRight INT DEFAULT 0;
                    DECLARE X INT DEFAULT 0;
                    DECLARE arrayNameQuoted VARCHAR(255);
                    SET arrayNameQuoted = CONCAT('"',arrayName,'"');
                    /*check arrayname exist*/
                    IF(LOCATE(arrayNameQuoted,_field)= 0) THEN 
                        RETURN NULL;    
                    ELSE
                        /*get value behind arrayName1*/
                        SET _field = SUBSTRING(_field,1,LENGTH(_field)-1);
                        SET arrayValue = SUBSTRING(_field, LOCATE(arrayNameQuoted,_field)+LENGTH(arrayNameQuoted)+1, LENGTH(_field));
                        /*get json delimiter*/
                        SET arrayStartDelimiter = LEFT(arrayValue, 1);
                        IF(arrayStartDelimiter='{') THEN
                            SET arrayEndDelimiter = '}';                            
                            loopBrackets: WHILE X < (LENGTH(arrayValue)) DO                 
                                SET countBracketLeft = countBracketLeft +IF(SUBSTRING(arrayValue,X,1)=arrayStartDelimiter,1,0);
                            SET countBracketRight = countBracketRight +IF(SUBSTRING(arrayValue,X,1)=arrayEndDelimiter,1,0);
                            IF(countBracketLeft<>0 AND countBracketLeft=countBracketRight) THEN
                                SET arrayCountDelimiter = X;
                                LEAVE loopBrackets;
                            ELSE
                                SET X = X + 1;
                            END IF;
                            END WHILE;
                                    ELSEIF(arrayStartDelimiter='[') THEN
                                        SET arrayEndDelimiter = ']';
                                        SET arrayCountDelimiter = LENGTH(SUBSTRING_INDEX(arrayValue, arrayEndDelimiter, 0));
                                     ELSEIF(arrayStartDelimiter='"') THEN
                                        SET arrayEndDelimiter = '"';
                                        SET arrayCountDelimiter = LENGTH(SUBSTRING_INDEX(arrayValue, arrayEndDelimiter, 0));
                                    ELSE 
                                        SET arrayStartDelimiter = "";
                                        IF((LOCATE(",",arrayValue)> LOCATE("}",arrayValue))) THEN
                            SET arrayEndDelimiter = ",";
                            ELSE
                            SET arrayEndDelimiter = "}";
                            END IF;
                            SET arrayCountDelimiter = LENGTH(SUBSTRING_INDEX(arrayValue, arrayEndDelimiter, 0));
                        END IF;
                        SET arrayValueTillDelimit = SUBSTRING(arrayValue, 1, arrayCountDelimiter);
                        SET arrayCountDelimiter = LENGTH(arrayValueTillDelimit) - LENGTH(REPLACE(arrayValueTillDelimit, arrayStartDelimiter, ""));
                        SET arrayValue = SUBSTR(arrayValue,LENGTH(arrayStartDelimiter)+1);
                        IF(arrayStartDelimiter='{') THEN
                            SET arrayValue = SUBSTRING_INDEX(arrayValue, arrayEndDelimiter, arrayCountDelimiter);
                        ELSE
                            SET arrayValue = SUBSTRING_INDEX(arrayValue, arrayEndDelimiter, arrayCountDelimiter+1);
                        END IF;
                        RETURN (arrayValue);
                    END IF;
                    END$$
    DELIMITER ;
    

提交回复
热议问题