代码之家  ›  专栏  ›  技术社区  ›  Andrew

mysql查询与json字段完全匹配不工作

  •  1
  • Andrew  · 技术社区  · 6 年前

    表如下:

    my_table
    id (int)   create_time (timestamp)   meta_data (json)
    1          2019-01-20 18:35:42        {"my property": "123"}
    2          2019-01-20 19:35:42        {"more data": "456"}
    

    我试过询问:

    SELECT * FROM my_table
    WHERE meta_data = '{"my property": "123"}';
    
    SELECT * FROM my_table
    WHERE meta_data = '\{\"my property\"\: \"123\"\}';
    

    它不起作用,我如何查询JSON字段字符串的精确匹配?

    我注意到这确实有效…

    SELECT * FROM my_table
    WHERE meta_data LIKE '\{\"my property\"\: \"123\"\}';
    

    我需要用吗 LIKE ?为什么? = 不工作?

    5 回复  |  直到 6 年前
        1
  •  1
  •   Tim Biegeleisen    6 年前

    使用 JSON_CONTAINS :

    SELECT *
    FROM my_table
    WHERE JSON_CONTAINS(meta_data, '"123"', '.$"my property"');
    

    enter image description here

    Demo

    笔记:

    • 因为要与键匹配的目标值 my property 是一个文本字符串,我们还需要搜索双引号。
    • 逃离钥匙 我的财产 在JSON路径中,我们可以使用双引号来转义它。
        2
  •  1
  •   Bill Karwin    6 年前

    如果要将JSON列与JSON值进行比较,请使用 JSON_OBJECT() 创造价值。

    演示:

    create table t (id int primary key, data json);
    
    insert into t values (1, json_object('my property', '123'));
    insert into t values (2, json_object('more_data', 456));
    
    select * from t where data = json_object('more_data', 456);
    +----+--------------------+
    | id | data               |
    +----+--------------------+
    |  2 | {"more_data": 456} |
    +----+--------------------+
    
        3
  •  1
  •   Andrew    6 年前

    我知道JSON字段是一种特殊的字段类型,它的设计允许您轻松地查询特定的属性,但我希望能够轻松地检查完整的JSON。显然,json字段有一些参数导致 = 不按我的预期工作。

    这就是我想出来的解决方案,Cast JSON 作为 CHAR :

    SELECT * FROM my_table
    WHERE CAST(meta_data as CHAR) = '{"my property": "123"}';
    

    一个更好的想法可能是:

    SELECT * FROM my_table
    WHERE meta_data = CAST('{"my property": "123"}' AS JSON);
    

    您还可以通过使用cast(value as json);将其他类型的值强制转换为json类型来获取json值。” https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html#function_json-quote

        4
  •  0
  •   Ratish Bansal    6 年前

    你应该提到这个 https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

    使用JSON数据进行查询

        5
  •  0
  •   Allen King    6 年前

    尝试(根据属性和数据类型的正确名称进行修改。如果字符串使用“123”。

    SELECT * FROM my_table WHERE JSON_EXTRACT(meta_data, "$.`my property`")= 123
    

    或者可能是

    SELECT * FROM my_table WHERE JSON_EXTRACT(meta_data, "$.my property")= 123