MySQL查询完全匹配JSON字段不起作用

时间:2019-01-20 19:02:25

标签: mysql json

表如下:

foo.html

我尝试使用以下查询:

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"}

它不起作用,如何查询json字段字符串的完全匹配?

我注意到这确实可行...

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

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

我需要使用SELECT * FROM my_table WHERE meta_data LIKE '\{\"my property\"\: \"123\"\}'; 吗?为什么LIKE不起作用?

5 个答案:

答案 0 :(得分:1)

使用JSON_CONTAINS

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

enter image description here

Demo

注意:

  • 由于与键my property匹配的目标值是文字字符串,因此我们还需要搜索双引号。
  • 要在JSON路径中转义键my property,我们可以使用双引号将其转义。

答案 1 :(得分:1)

我知道JSON字段是一种特殊的字段类型,旨在让您轻松查询特定属性,但是我希望能够轻松地对照完整的JSON进行检查。显然,JSON字段具有一些参数,这些参数会导致=无法正常工作。

这是我想出的解决方案,将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

答案 2 :(得分:1)

如果您想将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 :(得分:0)

您应该参考此 https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

使用JSON数据进行查询

答案 4 :(得分:0)

尝试(根据属性和数据类型的正确名称进行修改。如果String使用“ 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