我有一个像这样的对象的json列表
[{
"something": "bla",
"id": 2
}, {
"something": "yes",
"id": 1
}]
我的id
字段始终是数字值。但是当我试图找到id = 2
时,MySQL返回NULL
select
json_search(
json_extract(
'[{"something": "bla" ,"id": 2}, {"something": "yes","id": 1}]',
"$[*].id"
),
'one',
2
) as json_search;
json_search |
------------|
|
当我在json id
对象中使用字符串作为值而不是数值时,我得到了索引为0的结果。
select
json_search(
json_extract(
'[{"something": "bla" ,"id": "2"}, {"something": "yes","id": 1}]',
"$[*].id"
),
'one',
"2"
) as json_search;
json_search |
------------|
"$[0]" |
我正在使用MySQL 5.7.17
@@version |
-----------|
5.7.17-log |
MySQL中没有提供json数组中的数字搜索吗?
答案 0 :(得分:1)
你可以尝试一些复杂的,不直观的,可能有性能问题,但这是一个选择:
mysql> SELECT JSON_SEARCH(
-> REPLACE(
-> REPLACE(
-> REPLACE(
-> JSON_EXTRACT('[
'> {"something": "bla" ,"id": 2},
'> {"something": "yes","id": 1}
'> ]', "$[*].id"),
-> ', ', '","'),
-> '[', '["'),
-> ']', '"]'),
-> 'one', '2') `json_search`;
+-------------+
| json_search |
+-------------+
| "$[0]" |
+-------------+
1 row in set (0.00 sec)
答案 1 :(得分:0)
虽然JSON_EXTRACT
函数返回[2, 1]
并且它是有效的JSON,但如果您搜索documentation JSON_SEARCH
函数是:
JSON_SEARCH(json_doc,one_or_all,search_str [,escape_char [,path] ...])
因此,据我所知,您只能使用STRING
值,而不能使用数值。但问题的一个解决方案可能是使用JSON_CONTAINS
函数,因为它返回1或0,如果数值存在或不存在。
select
json_contains(
json_extract(
'[{"something": "bla" ,"id": 2}, {"something": "yes","id": 1}]',
"$[*].id"
),
"2"
) as json_contains;
唯一的问题是您无法获取JSON文档中给定值的路径。希望它有所帮助。