表如下:
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
不起作用?
答案 0 :(得分:1)
使用JSON_CONTAINS
:
SELECT *
FROM my_table
WHERE JSON_CONTAINS(meta_data, '"123"', '.$"my property"');
注意:
my property
匹配的目标值是文字字符串,因此我们还需要搜索双引号。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