Mysql - 如何合并两个 json 字符串数组而不重复?

Bru*_*ina 3 mysql

如果我在 mysql 中有两个 json 字符串数组,是否有本机(或非本机)方法将这两个数组合并为一个具有唯一字符串的数组?如果我尝试,json_merge我会得到以下重复结果:

set @array1 =JSON_EXTRACT('["apple","pear","banana"]', '$');
set @array2 =JSON_EXTRACT('["pear","banana","apple","kiwi"]', '$');
select json_merge(@array1,@array2);
    > ["apple", "pear", "banana", "pear", "banana", "apple", "kiwi"]
Run Code Online (Sandbox Code Playgroud)

如果尝试json_merge_preserve给我相同的结果:

set @array1 =JSON_EXTRACT('["apple","pear","banana"]', '$');
set @array2 =JSON_EXTRACT('["pear","banana","apple","kiwi"]', '$');
select json_merge_preserve(@array1,@array2);
    > ["apple", "pear", "banana", "pear", "banana", "apple", "kiwi"]
Run Code Online (Sandbox Code Playgroud)

是否有返回唯一数组的函数?

["apple",  "banana", "pear", "kiwi"]
Run Code Online (Sandbox Code Playgroud)

编辑:json_merge_patch不起作用,因为它只用第二个数组替换第一个数组:

["apple",  "banana", "pear", "kiwi"]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我输了"grape"。我相信 patch 中的逻辑0 : 'val', 1:'val2'0:val3then合并0 : 'val3', 1:'val2'

ΔO *_*ro' 5

如果问题仍然存在,这里有一个简单的解决方案,使用 MySQL 8.0 的JSON_TABLE.

set @a1 ='["apple","grape","banana","banana","pear"]';
set @a2 ='["pear","banana","apple","kiwi","banana","apple"]';

select fruit
from json_table(
  json_merge_preserve(@a1, @a2),
  '$[*]' columns (
    fruit varchar(255) path '$'
  )
) as fruits
group by fruit; # get distinct values

# gives
apple
grape
banana
pear
kiwi
Run Code Online (Sandbox Code Playgroud)

为了获得单行响应,我们必须放弃group by并获得更多创意。

不幸的是,JSON_ARRAYAGG不支持distinct指令,所以我们必须使用GROUP_CONCAT

set @a1 ='["apple","grape","banana","banana","pear"]';
set @a2 ='["pear","banana","apple","kiwi","banana","apple"]';

select fruit
from json_table(
  json_merge_preserve(@a1, @a2),
  '$[*]' columns (
    fruit varchar(255) path '$'
  )
) as fruits
group by fruit; # get distinct values

# gives
apple
grape
banana
pear
kiwi
Run Code Online (Sandbox Code Playgroud)

要获得正确的 json 数组在线响应,我们只需玩弄CONCATs

select group_concat(distinct fruit)
from json_table(
  json_merge_preserve(@a1, @a2),
  '$[*]' columns (
    fruit varchar(255) path '$'
  )
) as fruits;
# without group by directive!

# gives: apple,banana,grape,kiwi,peas
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了一个合适的JSON_ARRAYAGG解决方案,使用另一个嵌套的虚拟表来group产生结果。

select json_arrayagg(fruit)
from (
  select fruit
  from json_table(
    json_merge_preserve(@a1, @a2),
    '$[*]' columns (
      fruit varchar(255) path '$'
    )
  ) as fruits
  group by fruit -- group here!
) as unique_fruits;
Run Code Online (Sandbox Code Playgroud)

阅读我使用 MySQL 作为 JSON 存储的最佳实践:)