Как получить объект json с конкретными значениями ключа из столбца массива json? - PullRequest
0 голосов
/ 18 января 2019

В моей таблице MySQL 8.0 у меня есть столбец JSON ARRAY. Это массив объектов JSON. Я хочу выбрать один объект из массива каждой строки на основе пар ключ-значение в объектах.

Пример строки:

[{bool:false, number:0, value:'hello'}, 
{bool:true, number:1, value:'world'},
{bool:true, number:2, value:'foo'},
{bool:false, number:1, value:'bar'}]

То, что я пытаюсь сделать, это получить 'значение' ГДЕ bool = true, И number = 1. Поэтому я хочу запрос, который в этом примере возвращает «мир».

Что бы сработало, если бы я мог получить индекс объекта, где bool = true и number = 1, в этом примере он вернул бы '$ [1]'.

Я пытаюсь выполнить запрос по всему столбцу, установив в новом столбце значение, возвращаемое из запроса. Возможно ли это с функциями MySQL JSON? Я просмотрел ссылки, но ни у одного из них нет объектов внутри массивов, как в моем примере.

РЕДАКТИРОВАТЬ: Если я делаю

SELECT JSON_SEARCH(column->"$[*]", 'all', '1');
SELECT JSON_SEARCH(names->"$[*]", 'all', 'true');

Я получаю пути / индексы объектов, где число = 1 и где bool = true, соответственно. Я хотел бы, чтобы эти два результата совпали.

1 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать JSON_TABLE для преобразования JSON в производную таблицу, из которой затем можно извлечь значения из:

SELECT j.value
FROM test t
JOIN JSON_TABLE(t.jsonStr, 
        '$[*]'
        COLUMNS(bool BOOLEAN PATH '$.bool',
                number INT PATH '$.number',
                value VARCHAR(20) PATH '$.value')) j                    
WHERE j.bool = true AND j.number = 1

Выход:

value
world

Если вы также хотите получить индекс в пределах каждого значения JSON соответствующего value, вы можете добавить предложение FOR ORDINALITY к вашему JSON_TABLE например ::

SELECT j.idx, j.value
FROM test t
JOIN JSON_TABLE(t.jsonStr, 
        '$[*]'
        COLUMNS(idx FOR ORDINALITY,
                bool BOOLEAN PATH '$.bool',
                number INT PATH '$.number',
                value VARCHAR(20) PATH '$.value')) j
WHERE j.bool = true AND j.number = 1

Выход:

idx     value
2       world

Демонстрация на dbfiddle

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