вернуть нулевое значение в JSON_EXTRACT

0

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"

return "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 
  • 0
    Вам не хватает двух объявлений переменных: DECLARE ID VARCHAR(100); DECLARE PersonID VARCHAR(100);
  • 0
    извините и спасибо, извините, я забыл эти строки в моем коде, но есть еще проблема
Теги:
function
error-handling
extract

1 ответ

0
Лучший ответ

Я создал небольшой тест, чтобы воспроизвести ваши проблемы. В основном вам просто нужно обновить S1 и S2 следующим образом:

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

И это так. Вы можете проверить тест в следующем URL-адресе: https://www.db-fiddle.com/f/2TPgF868snjwcHN3uwoSEA/0

  • 0
    Ваше решение правильное; ИМХО, идеал должен хранить его в таблице, но по одному объекту в строке вместо jsonarray, но это только мое мнение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню