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

问题描述 投票:0回答:3

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

例如:

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

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

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

mysql sql arrays json mysql-5.7
3个回答
3
投票

没有直接的方法可以从 MySQL 中的 JSON 数组中获取不同的值。一种方法可能是“利用序列/数字生成器表概念”。该序列表可以用作派生表(子查询),或者您可以创建一个在数据库中存储数字的永久表。 然后,我们将使用此序列表从数组中第一个键、第二个键、第三个键等位置取出值。一旦我们提取出单独行中的值,我们就可以简单地使用

JSON_EXTRACT()

来从中获取唯一值。之后,我们可以使用

DISTINCT
函数将这些唯一值重新聚合回 JSON 数组。

架构(MySQL v5.7)


JSON_ARRAYAGG()

查询

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;

在 DB Fiddle 上查看

    

以下内容可能会对使用MySQL 8

的人有所帮助

3
投票
| unq_json_array | | --------------- | | ["a", "b", "c"] |

JSON_TABLE

JSON_OBJECTAGG

的组合来完成此操作,不会太麻烦。很遗憾我们不能做类似的事情

JSON_KEYS
例如:
JSON_ARRAYAGG(DISTINCT item)
我还制作了一个DBFiddle来展示我的作品:

https://www.db-fiddle.com/f/6hgSEXPJWcm2CH8K16z6gQ/0

JSON_TABLE 

https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

JSON 搜索函数:
https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

正如 Gabe Gates 所说,在我们拥有 SET @json = '["a", "b", "b", "a", "c"]'; SELECT JSON_KEYS(JSON_OBJECTAGG(item, "")) FROM JSON_TABLE(@json, '$[*]' COLUMNS( item TEXT PATH '$' ) ) as items;

之前,唯一的方法是:

0
投票

如果您的字符集排序规则不区分大小写,例如 utf8mb4_0900_ai_ci,则上述内容会将“HeLLO”视为“hello”

    

© www.soinside.com 2019 - 2024. All rights reserved.