如何使用 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
如何使用我的 MYSQL 数据库中的数据填充 JSON 数组?