Как совместить JSON_REMOVE и JSON_SEARCH в одном запросе?

150
08 мая 2019, 14:30

У меня есть таблица test, в которой есть поле json с форматом данных JSON.
В этом поле лежит массив [2, 3, 4, 5].
Я хочу удалить из массива троечку. И успешно делаю это следующим запросом:

UPDATE test SET json = JSON_REMOVE(json, '$[1]') WHERE `id` = 2;

Но что, если я знаю, что в массиве есть элемент со значением 3, но не знаю его индекса?
Пытаюсь выполнить следующий запрос:

UPDATE test SET json = JSON_REMOVE(
    json,
    '$[
        JSON_SEARCH(json, 'one', 3)
    ]'
) WHERE `id` = 2;

Получаю ошибку синтаксиса.

Что я делаю не так?

Answer 1

Что я делаю не так?

Скобок и кавычек настолько много, что запрос потерял смысл; надо быть проще:

UPDATE test 
  SET json = JSON_REMOVE(json, JSON_UNQUOTE(JSON_SEARCH(json, 'one', 3)))
  WHERE `id` = 2;

А если говорить более формально, то JSON_SEARCH () и так возвращает путь, так что не нужно никаких дополнительной обработки значения прежде чем передать его JSON_REMOVE ().

Замечания:

  • JSON_SEARCH () возвращает ответ как json-документ — строку в кавычках, поэтому можно использовать JSON_UNQUOTE, чтобы из убрать.
  • В MySQL JSON_SEARCH () не может искать не-строковые значения — это очевидный баг, хотя некоторые считают, что его просто надо задокументировать; в MariaDB данной проблемы нет.
READ ALSO
Как вывести имя вместо id, SQL?

Как вывести имя вместо id, SQL?

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

160
Несоответствие кода страницы в Chrome и самой страницы [закрыт]

Несоответствие кода страницы в Chrome и самой страницы [закрыт]

Пытаюсь сделать парсер сайта SoundCloud на pythonПри попытке получить код страницы, что через requests, что через Selenium html-код страницы выдается некорректным

175
2 дива на одном уровне

2 дива на одном уровне

Есть лого и 2 текстаНужно, чтобы они были в одном диве, но лого всегда улетает вниз

168