在MySQL中,没有直接的方法可以从JSON数组中获取不同的值。一种方法是utilize a Sequence/Number Generator table concept。这个序列表可以用作派生表(子查询),或者您可以在数据库中创建一个存储数字的永久表。 然后,我们将使用这个序列表从数组的第一个键、第二个键、第三个键等处JSON_EXTRACT()值。一旦我们在单独的行中提取出值,我们可以简单地使用DISTINCT从它们中获得唯一值。然后,我们可以使用JSON_ARRAYAGG()函数将这些唯一值重新聚合为JSON数组。
Schema(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;
3条答案
按热度按时间dkqlctbz1#
在MySQL中,没有直接的方法可以从JSON数组中获取不同的值。一种方法是utilize a Sequence/Number Generator table concept。这个序列表可以用作派生表(子查询),或者您可以在数据库中创建一个存储数字的永久表。
然后,我们将使用这个序列表从数组的第一个键、第二个键、第三个键等处
JSON_EXTRACT()
值。一旦我们在单独的行中提取出值,我们可以简单地使用DISTINCT
从它们中获得唯一值。然后,我们可以使用JSON_ARRAYAGG()
函数将这些唯一值重新聚合为JSON数组。Schema(MySQL v5.7)
查询
结果
View on DB Fiddle
aamkag612#
以下内容可能对使用MySQL 8的用户有所帮助
您可以使用
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
4smxwvx53#
在我们得到
JSON_ARRAYAGG(DISTINCT item)
之前,使用distinct的唯一方法是,这意味着它的行为完全相同:资料
SQL
结果
如果字符集排序规则不区分大小写,如utf8mb4_0900_ai_ci(ci表示比较时不区分大小写),则上面将“A”视为“a”。