Как получить уникальные / отличные элементы внутри массива JSON в MySQL 5.7 - PullRequest
3 голосов
/ 22 сентября 2019

У меня mysql 5.7 с денормализованной таблицей, в которой есть несколько столбцов JSON.Мне нужно извлечь уникальные / отличные значения в строке для столбца массива.

Например: ["a", "b", "b", "a", "c"] ожидаемый результат должен быть ["a", "b", "c"];

SET @json = '["a", "b", "b", "a", "c"]'; Мне нужно получить уникальные значения в этом списке.

["a", "b", "c"];

1 Ответ

2 голосов
/ 22 сентября 2019

В MySQL нет прямого метода для получения различных значений из массива JSON.Одним из способов может быть использование концепции таблицы генератора последовательностей / чисел .Эта таблица последовательности может использоваться как производная таблица (подзапрос), или вы можете создать постоянную таблицу для хранения чисел в вашей базе данных.

Затем мы будем использовать эту таблицу последовательности для JSON_EXTRACT()значения из массива в первый ключ, второй ключ, третий ключ и так далее.После того, как мы извлекли значения в отдельной строке, мы можем просто использовать DISTINCT, чтобы извлечь из них уникальные значения.После этого мы можем использовать функцию JSON_ARRAYAGG() для повторного агрегирования этих уникальных значений обратно в массив JSON.

Схема (MySQL v5.7)

SET @json = '["a", "b", "b", "a", "c"]';

Запрос

SELECT Json_arrayagg(dt.val) AS unq_json_array
FROM   (SELECT DISTINCT Json_extract(@json, Concat('$[', seq.n, ']')) AS val
        FROM   (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL
                SELECT 2 UNION ALL SELECT 3 UNION ALL 
                SELECT 4 UNION ALL SELECT 5 UNION ALL
                SELECT 6 UNION ALL SELECT 7 UNION ALL
                SELECT 8 UNION ALL SELECT 9) AS seq) AS dt
WHERE  dt.val IS NOT NULL;

Результат

| unq_json_array  |
| --------------- |
| ["a", "b", "c"] |

Просмотр на БД Fiddle

...