如何使用AND查询MYSQL中的JSON数组

时间:2017-01-11 11:37:29

标签: mysql json

如果我在mysql数据库的列中有如下的json

char*

如何在mysql中选择同一对象名称中的所有行=' John'并检查= true。

json对象可能有更多的键,键可能没有特定的顺序。

3 个答案:

答案 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 keyStoring Data in MySQL as JSON

从mySQL 5.7开始,有一些与json相关的函数。请参阅this wagon articlemySQL 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)