带有数组的 MariaDB JSON 函数

Tec*_*ast 2 sql json mariadb

我将 JSON 数组作为字符串存储在 MariaDB 表中。当数组中的任何位置存在某些键值时,我想返回行。

我进行了以下测试....

set @json='[{"name":"Albert","state":"IL"},{"name":"John","state":"CA"}]'
Run Code Online (Sandbox Code Playgroud)

执行以下查询...

select json_value(@json,'$[0].name')='Albert'
Run Code Online (Sandbox Code Playgroud)

它让我得到了想要的结果,那就是......

1
Run Code Online (Sandbox Code Playgroud)

甚至下面的查询也给了我相同的结果(可能是 '*' 被视为第一个元素)...

select json_value(@json,'$[*].name')='Albert'
Run Code Online (Sandbox Code Playgroud)

但是当我在条件中提供第二个名字(“约翰”)时,我没有得到任何结果......

select json_value(@json,'$[*].name')='John'
Run Code Online (Sandbox Code Playgroud)

结果...

0
Run Code Online (Sandbox Code Playgroud)

所以我的观察是,当我们提供数组索引时,“json_value”函数能够返回所需的结果。

有没有办法可以避免指定数组索引并搜索所需的键值?

Tec*_*ast 5

正如@dbfiddle 所评论的,我尝试使用JSON_SEARCH函数。

这是我试图获得所需结果的方法。

create table label_test(labels VARCHAR(1000));

insert into label_test values ('[{"name":"Albert","state":"IL"},{"name":"John","state":"CA"}]');

select * from label_test where JSON_SEARCH(labels,'all','John') like '"$[%].name"';
Run Code Online (Sandbox Code Playgroud)

结果是预期的整行。

[{"name":"Albert","state":"IL"},{"name":"John","state":"CA"}]
Run Code Online (Sandbox Code Playgroud)