如果我在mysql数据库的列中有如下的json
char*
如何在mysql中选择同一对象名称中的所有行=' John'并检查= true。
json对象可能有更多的键,键可能没有特定的顺序。
答案 0 :(得分:2)
只需使用JSON_CONTAINS:
SELECT * from `users`
WHERE JSON_CONTAINS(`data`, '{"name": "John","checked": true}');
答案 1 :(得分:0)
如果键总是以相同的顺序,您可以尝试匹配字符串。假设您的列名为people
SELECT
IF(people LIKE '%[
{
\"name\": \"John\",
\"checked\": true%', TRUE, FALSE) AS 'john_checked'
FROM table
WHERE (people LIKE '%[
{
\"name\": \"John\",
\"checked\": true%')
了解此解决方案后,您可以创建一个更短的SQL,如下所示。您可以单独使用它,或将其用作将返回所有行的查询的where子句中的子查询。
SELECT
IF(people LIKE '%\"checked\": true%', TRUE, FALSE) AS 'john_checked'
FROM table
WHERE (people LIKE '%\"name\": \"John\"%')
你可能会在这里看到JSON不适合存储在mySQL中。
更好的解决方案是将数据库设计为关系数据库,即有一个名为people
的附加表和一个链接数据的列。说如何设计这将需要我更多地了解您的数据/主题,但您应该了解SQL“连接”和规范化。
还有其他问题在mySQL中讨论JSON,例如Storing JSON in database vs. having a new column for each key和Storing Data in MySQL as JSON
从mySQL 5.7开始,有一些与json相关的函数。请参阅this wagon article和mySQL documentation。
答案 2 :(得分:0)
以下是如何在postgresql中完成的:
create table users (data jsonb);'
insert into users values ('[{"name": "John", "checked": "true"}, {"name": "Lucy", "checked": "false"}]'),('[{"name": "John", "checked": "false"}, {"name": "Lucy", "checked": "false"}]'),('[{"name": "John", "checked": "false"}, {"name": "Lucy", "checked": "true"}]');
select * from users, jsonb_array_elements(users.data) obj
where obj->>'name' = 'John' and obj->>'checked' = 'true';
data | value
-----------------------------------------------------------------------------+-------------------------------------
[{"name": "John", "checked": "true"}, {"name": "Lucy", "checked": "false"}] | {"name": "John", "checked": "true"}
(1 row)