当前位置: 首页 > 知识库问答 >
问题:

如何使用和在MYSQL中查询JSON数组

宗政昱
2023-03-14

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

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

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

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

共有3个答案

有翰海
2023-03-14

下面是如何在postgreql中完成:

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)
金成济
2023-03-14

如果键的顺序始终相同,则可以尝试匹配字符串。假设您的专栏名为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“连接”和规范化。

还有其他问题,讨论JSON在MySQL中,如存储JSON在数据库与有一个新的列为每个键和存储数据在MySQL作为JSON

在MySQL 5.7中,有一些与json相关的函数。请参阅这篇文章和mySQL留档。

章博耘
2023-03-14

只需使用JSON,它包含:

SELECT * from `users`
WHERE JSON_CONTAINS(`data`, '{"name": "John","checked": true}');
 类似资料:
  • 问题内容: 如何在MySql中运行此查询? 它会显示如下错误消息: 问题答案: 该语句/方法适用于PostgreSQL和Sybase(我想可能还有更多),所以也许您可以看一下: http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html 它应该向您展示一些使用MySQL的方法(以及PHP中的一两个方法,我只知道它不在您的标签列

  • 想知道如何看待mysql json专栏? category_ids例如) [19, 102, 108] 如果我想搜索包含类别id 102的产品列表,如何使用queryDSL进行查询? 我尝试了JsonNode类型,但它不起作用。

  • 问题内容: 我想查询mysql数据库中的表以获取切片值: 但是我得到这个错误: 我怎样才能解决这个问题? 问题答案: sqlx为此提供了很好的帮助:在In()中,我们只需要使用args和Rebind准备查询,如下所示: 另外,我建议您在这里看看:http : //jmoiron.github.io/sqlx/有很多示例,包括 IN

  • 问题内容: 我正在尝试使用数组查询MySQL数据库,但是遇到了麻烦! 我有一个名为客户的表,我希望能够从“扇区”列等于$ sectorlink的所有行中选择“名称”。 然后,我想将所有名称放入数组,以便执行下一个查询:从另一个表中选择所有行,这些表的“ client”列等于从第一个查询返回的名称之一。我做错了,因为它返回了致命的SQL错误。我对所有变量感到困惑! $ sectorlink和$ co

  • 问题内容: 我正在尝试使用 Java 和 Elasticsearch 进行Elasticsearch搜索。elasticsearch为Java提供了API,这很酷。 问题是,我希望在Java中创建一个方法,该方法接收一个字符串(应该是一个包含用于搜索的信息的JSON),该字符串反映此对Elasticsearch的HTTP调用 但是我希望这种方法尽可能通用。 所以问题是: 是否可以使用Java AP

  • 问题内容: 我有下表 因此,如何从“杂项”列中检索product_name,image_path和仅“ group_id”值(如“ 40067”)。 我在下面的查询中尝试过,但在“杂项”列中返回1/0。 有人知道该怎么做吗? 问题答案: 该函数仅返回0或1。您将不得不使用其他字符串函数。 试试这个:。但这假设group_id始终具有5个字符。 因此,这是更好的:。 这里是一个小提琴,以显示它的工作