关于数值的MySQL json_search

时间:2017-06-29 13:39:19

标签: mysql sql json

我有一个像这样的对象的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数组中的数字搜索吗?

2 个答案:

答案 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文档中给定值的路径。希望它有所帮助。