我有 mysql 5.7,其中有一个包含一些 JSON 列的非规范化表。我需要为数组列提取每行的唯一/不同值。
例如:
["a", "b", "b", "a", "c"]
预期输出应该是["a", "b", "c"];
SET @json = '["a", "b", "b", "a", "c"]';
我需要在此列表中获取唯一值。
["a", "b", "c"];
没有直接的方法可以从 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
的人有所帮助| 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;
如果您的字符集排序规则不区分大小写,例如 utf8mb4_0900_ai_ci,则上述内容会将“HeLLO”视为“hello”