如何使用 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个查询中返回 node.js mysql 中的嵌套 json

使用 JOOQ 查询 mysql 中的 json 字段

如何使用我的 MYSQL 数据库中的数据填充 JSON 数组?

mysql数据库中某个字段存的是json数据,如何对json数据中的数据进行操作?

如何从 MySQL 中的数字键嵌套 JSON 字段中提取值

如何使用 MySQL 查询 json 数组