我已经尝试找出一种方法来查找给定字符串JSON_ARRAY的元素。我要实现的是contains all
功能。
说我有一个名为Movies
的表,其列为name
和genre
,而一个名为Genre
的表,其列为id
。
NAME GENRE
Batman 1
Batman 2
Aquaman 2
Joker 3
IT 4
ID NAME
1 Drama
2 Action
3 Thriller
4 Horror
现在,如果我有一个JSON_ARRAY与
SET @array = JSON_ARRAY("Action", "Drama");
[给定此JSON_ARRAY给我Batman
的存储过程如何创建?我认为解决方案是SQL递归,但是我不确定...
SET @array = JSON_ARRAY("Action", "Drama");
sproc.GetMovieGivenGenres(@array, @out_movie);
SELECT @out_movie; --> Batman
我们可以尝试使用JSON_SEARCH()
函数,该函数具有搜索JSON数组的能力:
SELECT
m.NAME
FROM Movies m
INNER JOIN Genre g
ON m.GENRE = g.ID
GROUP BY
m.NAME
HAVING
COUNT(CASE WHEN JSON_SEARCH(@array, 'one', g.NAME) IS NOT NULL THEN 1 END) =
JSON_LENGTH(@array);
对于每个电影,JSON_SEARCH
函数将在输入数组中找到给定类型的情况下返回非NULL
值。匹配的电影是在输入数组中包含所有流派的电影。
在mySQL 8中,您可以使用JSON_TABLE()将JSON格式转换为表。然后,您可以将生成的表与两个表连接起来:
SET @array = JSON_ARRAY("Action", "Drama");
select m.NAME
from json_table(
@array,
'$[*]' columns (genre_name varchar(50) path '$')
) j
join Genre g on g.NAME = j.genre_name
join Movies m on m.GENRE = g.ID
group by m.NAME
having count(*) = json_length(@array);
这样,MySQL将能够使用Genre(NAME)
上的索引。