【问题标题】:return null value in the JSON_EXTRACT在 JSON_EXTRACT 中返回空值
【发布时间】:2018-03-05 16:36:03
【问题描述】:

MyJsonArray

[{"ID":"D29","PersonID":"23616639"},{"ID":"D30","PersonID":"22629626"}]

我想从 sql 函数中将此数组设置到我的表中,但在变量中返回空值,而不是在我的数据库中设置记录 我的功能:

    DELIMITER $$
CREATE DEFINER=`toshiari`@`localhost` FUNCTION `setTitleRecords`(`Title` VARCHAR(166) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, `List` JSON) RETURNS int(4)
BEGIN
    DECLARE Item                INT;
    DECLARE HolderLENGTH        INT;
    DECLARE ValidJson           INT;
    DECLARE ID                  VARCHAR(166);
    DECLARE PersonID            VARCHAR(166);
    DECLARE S1                  VARCHAR(166);
    DECLARE S2                  VARCHAR(166);
    SET ValidJson = (SELECT JSON_VALID(List));
    IF ValidJson = 1 THEN 
        SET HolderLENGTH = (SELECT JSON_LENGTH(List));
        SET Item = 0;
        WHILE Item < HolderLENGTH DO
            SET S1 = CONCAT("'$[",Item, "].ID'");
            SET S2 = CONCAT("'$[",Item, "].PersonID'");
            SET ID       = (SELECT JSON_EXTRACT(List,S1));
            SET PersonID = (SELECT JSON_EXTRACT(List,S2));
            INSERT INTO `Titles`(`ID`,`PersonID`,`Title`) VALUES (ID, PersonID, Title);
            SET Item = Item + 1;
        END WHILE;
        RETURN 3;       
    ELSE
        RETURN 2;       
    END IF;
END$$
DELIMITER ;

当我在Sql命令中使用这个命令没有问题并且返回真值

SELECT JSON_EXTRACT('[{"ID":"D29","PersonID":"23616639"},{"ID":"D30","PersonID":"22629626"}]','$[0].ID')  return "D29"

返回 “D29” 但是在从这段代码运行函数时 返回错误并说:

SET @p0='DR'; SET @p1='[{\"ID\":\"D29\",\"PersonID\":\"23616639\"},{\"ID\":\"D30\",\"PersonID\":\"22629626\"}]'; SELECT `setTitleRecords`(@p0, @p1) AS `setTitleRecords`;


#4042 - Syntax error in JSON path in argument 2 to function 'json_extract' at position 1 

【问题讨论】:

  • 您缺少两个变量声明:DECLARE ID VARCHAR(100); DECLARE PersonID VARCHAR(100);
  • 对不起,谢谢,对不起,我忘记了我的代码中的那一行,但还是有问题

标签: mysql json function error-handling extract


【解决方案1】:

我创建了一个小测试,以重现您的问题。基本上你只需要通过以下方式重新声明 S1 和 S2:

SET S1 = CONCAT('$[',Item,'].ID');
SET S2 = CONCAT('$[',Item,'].PersonID');

就是这样。您可以在以下网址查看测试:https://www.db-fiddle.com/f/2TPgF868snjwcHN3uwoSEA/0

【讨论】:

  • 非常感谢楼主???!!!我可以问你关于你的意见逻辑代码!?我的意思是在 for "'while loop'" 中......或者有更好的方法来达到我的目的!?
  • 你的解决方案是正确的;恕我直言,理想的应该是将它存储在一个表中,但是,每行一个对象,而不是一个 jsonarray,但这只是我的意见。
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2021-11-01
  • 2017-05-01
  • 2018-09-17
  • 2020-09-13
  • 2019-09-05
  • 2018-05-21
相关资源
最近更新 更多