MySQL - поиск в столбце данных JSON - PullRequest
3 голосов
/ 12 марта 2019

У меня есть столбец базы данных MySQL, который содержит строки в кодировке массива JSON. Я хотел бы найти в массиве JSON, где значение «Elapsed» больше определенного числа, и вернуть соответствующее значение TaskID объекта, значение которого было найдено. Я пытался использовать комбинации функций JSON_SEARCH, JSON_CONTAINS и JSON_EXTRACT, но не получил желаемых результатов.

[
    {
        "TaskID": "TAS00000012344", 
        "Elapsed": "25"
    },
    {
        "TaskID": "TAS00000012345",
        "Elapsed": "30"
    },
    {
        "TaskID": "TAS00000012346",
        "Elapsed": "35"
    },
    {
        "TaskID": "TAS00000012347",
        "Elapsed": "40"
    }
]

Ссылка на JSON выше, если я ищу "Elapsed"> "30", то 2 записи вернутся

  1. 'TAS00000012346'
  2. 'TAS00000012347'

Я использую MySQL версии 5.7.11 и новичок в запросе данных JSON. Любая помощь будет оценена. спасибо

1 Ответ

1 голос
/ 12 марта 2019

В MySQL pre-8.0 нет простого способа превратить массив JSON в набор записей (т. Е. Функция JSON_TABLE() еще не доступна).

Итак, так или иначе, нам нужновручную выполнить итерацию по массиву для извлечения соответствующих фрагментов данных (используя JSON_EXTRACT()).Вот решение, которое использует встроенный запрос для генерации списка чисел;Другой классический подход - использовать числовые таблицы.

Предполагается, что таблица с именем mytable содержит столбец с именем js, содержащий содержимое JSON:

SELECT 
    JSON_EXTRACT(js, CONCAT('$[', n.idx, '].TaskID')) TaskID,
    JSON_EXTRACT(js, CONCAT('$[', n.idx, '].Elapsed')) Elapsed
FROM mytable t
CROSS JOIN (
    SELECT 0 idx 
    UNION ALL SELECT 1 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3
) n
WHERE JSON_EXTRACT(js, CONCAT('$[', n.idx, '].Elapsed')) * 1.0 > 30

Примечание: в WHERE предложение, операция * 1.0 предназначена для принудительного преобразования в число.

Демонстрация на DB Fiddle с примерами данных:

| TaskID         | Elapsed |
| -------------- | ------- |
| TAS00000012346 | 35      |
| TAS00000012347 | 40      |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...