json中的Mariadb递归过程

时间:2019-02-22 18:07:34

标签: arrays json recursion mariadb procedure

这一次我遇到一个与递归相关的问题:

我正在尝试转型

此json:

["buyer_name", ["first_name", "aaa", "second_name", "bbb"]]

进入此php序列化数组:

s:10:"buyer_name";a:2:{s:10:"first_name";s:3:"aaa";s:11:"second_name";s:3:"bbb";};

使用MariaDB过程。

我在MariaDB中构建了这个简单的过程。

-- ----------------------------
-- Function getSerializedString
-- ----------------------------

DROP PROCEDURE IF EXISTS `getSerializedString`;
CREATE PROCEDURE `getSerializedString`(IN __input_string TEXT, OUT __output TEXT)
   LANGUAGE SQL DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 
   COMMENT 'Procedure returns a serialized __input_string with his __input_value.'
BEGIN
   /*
      Procedure returns a serialized __input_string with his __input_value.
   */
   DECLARE i INT UNSIGNED DEFAULT 0;
   IF (__output IS NULL) THEN
      SET __output = '';
   END IF;
   SET GLOBAL max_sp_recursion_depth = 255;

   WHILE (i < (JSON_LENGTH(__input_string))) DO
      IF (JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')) REGEXP '^[0-9]+$') THEN
         SET __output = CONCAT(__output, CONCAT('i', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
      ELSEIF (CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']'))) - CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), '.', '')) = 1) THEN
         SET __output = CONCAT(__output, CONCAT('d', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
      ELSE
         SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(@__input_string, CONCAT('$[' , i, ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
      END IF;

      IF (JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')) REGEXP '^[0-9]+$') THEN
         SET __output = CONCAT(__output, CONCAT('i', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
      ELSEIF (CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))) - CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '.', '')) = 1) THEN
         SET __output = CONCAT(__output, CONCAT('d', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
      ELSEIF ((REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '.', '')) NOT REGEXP '^[0-9]+$') THEN
         IF (SUBSTRING(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), 1, 1) = '[' AND SUBSTRING(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))), 1) = ']') THEN
            CALL `getSerializedString`(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), @res);
            SET __output = CONCAT(__output, CONCAT('a', ':', (JSON_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))) DIV 2), ':', '{', @res, '}'));
         ELSE
            SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
         END IF;
      ELSE
         SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
      END IF;
      SET i = i + 2;
   END WHILE;

END;

现在:

如果我只用这样的条目运行该过程:

[“名字”,“ aaa”,“年龄”,25]

它给出正确的结果。

当过程检测到嵌套数组时,就会出现问题,例如: [“ buyer_name”,[“ first_name”,“ aaa”,“ age”,25]]

并使用嵌套数组递归调用函数,在这种情况下: [“ first_name”,“ bbb”,“年龄”,30]

MariaDB返回null或空值。

以这种方式调用递归过程是否有错误?

如果该过程检测到没有嵌套数组,则说明它是完美的。

顺便说一句:我正在考虑json数组总是成对出现name:value。这就是为什么WHILE(i)增加2的原因。

感谢您的帮助和支持!!!

0 个答案:

没有答案