MySQL对数值的json_search

Mar*_*kus 5 mysql sql json

我有一个像这样的对象的json列表

[{
    "something": "bla",
    "id": 2
}, {
    "something": "yes",
    "id": 1
}]
Run Code Online (Sandbox Code Playgroud)

我的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 |
------------|
            |
Run Code Online (Sandbox Code Playgroud)

当我在我的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]"      |
Run Code Online (Sandbox Code Playgroud)

我正在使用MySQL 5.7.17

@@version  |
-----------|
5.7.17-log |
Run Code Online (Sandbox Code Playgroud)

MySQL不提供json数组中的数字搜索吗?

小智 0

尽管该JSON_EXTRACT函数正在返回[2, 1]并且它是有效的 JSON,但如果您搜索文档,该JSON_SEARCH函数是:

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, 路径] ...])

因此,据我了解,您只能使用STRING值,而不能使用数值。但解决问题的一种方法是使用该JSON_CONTAINS函数,因为无论数值存在与否,它都会返回 1 或 0。

select
    json_contains(
        json_extract(
            '[{"something": "bla" ,"id": 2}, {"something": "yes","id": 1}]',
            "$[*].id"
        ),
        "2"
    ) as json_contains;
Run Code Online (Sandbox Code Playgroud)

唯一的问题是您无法获取 JSON 文档中给定值的路径。希望有帮助。