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

Posted

技术标签:

【中文标题】如何使用 AND 查询 MYSQL 中的 JSON 数组【英文标题】:How to query JSON array in MYSQL with AND 【发布时间】:2017-05-26 04:28:59 【问题描述】:

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

[
 
  "name": "John",
  "checked": true
 ,
 
  "name": "Lucy",
  "checked": false
 
]

如何在 mysql 中选择相同对象名称 = 'John' 且选中 = true 的所有行。

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

【问题讨论】:

【参考方案1】:

只需使用 JSON_CONTAINS:

SELECT * from `users`
WHERE JSON_CONTAINS(`data`, '"name": "John","checked": true');

【讨论】:

如果 json 为 "name": John, "male": true, "checked": true 是否有效? 是的。它不依赖于 json/request 中的其他字段或字段顺序。 太棒了,谢谢!第一次有人花时间回答我的一个老问题,所以我真的很感激!【参考方案2】:

如果键的顺序始终相同,您可以尝试匹配字符串。假设您的列名为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。

【讨论】:

如果你看一下这个问题,你会发现我说 JSON 对象可能有更多的键,它们的顺序可能不同。 所以你做到了,希望我如何使用 SQL 匹配 JSON 的示例说明了它的困难。我链接到两个有详细问题的线程,他们倾向于建议使用 noSQL。我对 mySQL 5.7 不太熟悉,但是有一个链接。我不希望你的问题被完全忽略。 谢谢,但我想知道当任意数量的键可以按任意顺序排列时,是否有办法使用 mySQL 函数进行选择。 我添加了第二个 SQL sn-p。基本上你最好:如果它包含 "name": "John" 然后使用代码/脚本来解码 json;或者不在 mySQL 中存储 json,而是创建一个包含更多表的关系数据库(或使用 noSQL 解决方案)。只有您知道您想要解决的解决方案。 sn-p 的问题在于它会找到 John 为假但 Lucy 为真的行【参考方案3】:

这里是如何在 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)

【讨论】:

以上是关于如何使用 AND 查询 MYSQL 中的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章