如果我在 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'
如果问题仍然存在,这里有一个简单的解决方案,使用 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)
| 归档时间: |
|
| 查看次数: |
2742 次 |
| 最近记录: |