MYSQL Triggers: JSON_SEARCH - целочисленное значение в массиве json целых чисел

Я ищу использовать json_search, чтобы получить путь к массиву, который соответствует значению.

Я пытался, и это работает:

SET @j = '["3", "2", "1"]';
SELECT json_search(@j, 'one', '2');

возвращает $ [1];

Я пытался, и это не работает: (Как мне сделать эту работу?)

SET @j = '[3, 2, 1]';
SELECT json_search(@j, 'one', 2);

возвращает ноль;

В основном я хочу хранить @j как целочисленный массив вместо строкового массива для целей индексации. Можно ли как-нибудь изменить массив целых чисел в массив строк для сравнения, если у json_search нет способа работать с целыми числами?

Ответ 1

Это по замыслу, хотя я не могу согласиться с командой MySQL. Это должно быть реализовано.

https://bugs.mysql.com/bug.php?id=79233  [Закрыт]

Спецификация в https://dev.mysql.com/worklog/task/?id=7909 гласит: "Эта функция возвращает путь (и) к заданной строке. пути идентифицируют элементы объекта или слоты массива, которые являются символами строки ".

Таким образом, похоже, что целью этой функции был поиск строки. Документация должна быть обновлена, чтобы уточнить, что функция для поиска строковых скаляров, а не для скаляров в Генеральная.

Ответ 2

Я пробовал метод обходного пути, который является CONCAT для строки и возвращает ее в JSON и обновляет таблицу. Это не самый элегантный способ, поэтому, если у вас есть какие-либо предложения, пожалуйста, дайте мне знать!:)

BEGIN
DECLARE var1 INT default -2; //offsets
DECLARE var2 INT default 2; //offsets
SELECT StatusID into @statusList FROM UserStatusesIndex;
SET @statusID_to_remove = OLD.StatusID;
SET @startIndex = INSTR(@statusList, @statusID_to_remove);
SET @charLength = CHAR_LENGTH(@statusID_to_remove);

IF @startIndex <= 2 THEN SET var1=-1, var2=2; //If its the first index
ELSEIF (CHAR_LENGTH(@statusList) - @startIndex <= 2) THEN SET var1=-3, var2=0;  //If its the last index
ELSE SET var1=-2, var2=2;
END IF;

SET @newJson=CAST(CONCAT(SUBSTRING(@statusList, 1, @startIndex+var1), SUBSTR(@statusList, @startIndex + @charLength+var2, CHAR_LENGTH(@statusList) - @startIndex - @charLength+2)) as JSON);
UPDATE UserStatusesIndex SET [email protected] WHERE StatusCreator=OLD.StatusCreator;
END

Спасибо!

Ответ 3

Это работает:

SET @j = '[3, 2, 1]';
SELECT JSON_CONTAINS(@j, '3', '$');