如何在 MySQL 5.7 中的 JSON 数组中获取唯一/不同的元素

Ana*_*oub 8 mysql sql arrays json mysql-5.7

我有一个带有一些 JSON 列的非规范化表的 mysql 5.7。我需要为数组列提取每行唯一/不同的值。

例如:["a", "b", "b", "a", "c"]预期输出应该是["a", "b", "c"];

SET @json = '["a", "b", "b", "a", "c"]'; 我需要在此列表中获取唯一值。

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

Mad*_*iya 3

没有直接的方法可以从 MySQL 中的 JSON 数组中获取不同的值。一种方法是利用序列/数字生成器表概念。该序列表可以用作派生表(子查询),或者您可以创建一个在数据库中存储数字的永久表。

然后,我们将使用此序列表JSON_EXTRACT()从数组中的第一个键、第二个键、第三个键等处取出值。一旦我们提取出单独行中的值,我们就可以简单地DISTINCT从中获取唯一值。之后,我们可以使用JSON_ARRAYAGG()函数将这些唯一值重新聚合回 JSON 数组。

架构(MySQL v5.7)

SET @json = '["a", "b", "b", "a", "c"]';
Run Code Online (Sandbox Code Playgroud)

询问

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;
Run Code Online (Sandbox Code Playgroud)

结果

| unq_json_array  |
| --------------- |
| ["a", "b", "c"] |
Run Code Online (Sandbox Code Playgroud)

在 DB Fiddle 上查看