如何在MySQL 5.7中获取JSON数组中的unique / distinct元素

3htmauhk  于 2023-10-15  发布在  Mysql
关注(0)|答案(3)|浏览(174)

我有一个mysql 5.7,它有一个非规范化的表,其中有一些JSON列。我需要为数组列提取每行的唯一/非重复值。
例如:["a", "b", "b", "a", "c"]预期输出应为["a", "b", "c"];
SET @json = '["a", "b", "b", "a", "c"]';我需要在这个列表中获得唯一的值。
["a", "b", "c"];

dkqlctbz

dkqlctbz1#

在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;

结果

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

View on DB Fiddle

aamkag61

aamkag612#

以下内容可能对使用MySQL 8的用户有所帮助
您可以使用JSON_TABLEJSON_OBJECTAGGJSON_KEYS的组合来完成此操作,而不会遇到太多麻烦。我们不能做像JSON_ARRAYAGG(DISTINCT item)这样的东西真是太糟糕了。
举例来说:

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

SELECT JSON_KEYS(JSON_OBJECTAGG(item, ""))
FROM JSON_TABLE(@json, '$[*]'
    COLUMNS(
        item TEXT PATH '$'
    )
) as items;

我还做了一个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

4smxwvx5

4smxwvx53#

在我们得到JSON_ARRAYAGG(DISTINCT item)之前,使用distinct的唯一方法是,这意味着它的行为完全相同:

资料

set @json = '["a","b","c","A","B","d"]';

SQL

SELECT json_arrayagg(`d`)
from 
(
     select distinct `d`
     from json_table(@json, '$[*]' COLUMNS(`d` TEXT PATH '$')) `i`
)`g`;

结果

["a", "b", "c", "d"]

如果字符集排序规则不区分大小写,如utf8mb4_0900_ai_ci(ci表示比较时不区分大小写),则上面将“A”视为“a”。

相关问题