【问题标题】:Query a JSON column with an array of object in MySQL在 MySQL 中使用对象数组查询 JSON 列
【发布时间】:2016-12-12 08:45:06
【问题描述】:

我有一个带有以下数组的 json 列:

[
  {
    "id": "24276e4b-de81-4c2c-84e7-eed9c3582a31",
    "key": "id",
    "type": "input",
  },
  {
    "id": "e0ca5aa1-359f-4460-80ad-70445be49644",
    "key": "name",
    "type": "textarea",
    }
]

我尝试了以下查询以获取文档列中具有 id 24276e4b-de81-4c2c-84e7-eed9c3582a31 的行,但它没有返回结果:

select * from jobs WHERE document->'$[*].id' = "24276e4b-de81-4c2c-84e7-eed9c3582a31"

有人知道如何进行正确的查询吗?

【问题讨论】:

  • 您能否详细说明您的代码“不起作用”的原因?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行和异常/错误详细信息。请edit这些详细信息,否则我们可能无法提供帮助。

标签: mysql mysql-json


【解决方案1】:

我使用 mysql 5.7,所以 JSON_CONTAINS 可以像这样轻松使用:

SELECT JSON_CONTAINS(
                '[{"id": "24av","name": "she"},{"id": "e0c2", "name": "another_she"}]', 
                JSON_OBJECT('id', "e0c2")
                );

【讨论】:

  • 我不明白这是什么。当这个对象数组应该是列中的一个值时,为什么会有一个对象数组作为第一个参数传递给 JSON_CONTAINS,并且查询应该找到与查询具有某些匹配参数的对象。这对我来说根本没有任何意义。
  • @John 第一个参数可以是表中的列,在这里他对列值进行硬编码,以便您可以在没有任何表的情况下运行此查询。
  • 只是为了补充@Sep给出的答案,您可以查询json对象中的多个属性,如下所示:SELECT JSON_CONTAINS('[{"id": "24av","name": "she"},{"id": "e0c2", "name": "another_she"}]', JSON_OBJECT('id',"e0c2",'name',"another_she"));
  • 谢谢。所以我想我有点想知道如果你不对值进行硬编码,这会是什么样子——实际上,如果我从数据库中查询 JSON,我还没有这些值,对吗?
【解决方案2】:

试试这样:

SELECT * FROM jobs WHERE document->'$[*].id' = json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31");

它对我有用,但我认为以下方式更好:

SELECT * FROM jobs WHERE json_contains(document->'$[*].id', json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31"));

其实很容易记住返回值是JSON_TYPE,而不是字符串或其他东西;

【讨论】:

  • 第二种解决方案是完美的!
【解决方案3】:

也许是这个? @Barmar

SELECT * FROM jobs WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id') IS NOT NULL;

【讨论】:

    【解决方案4】:

    当您使用 document->'$[*].id' 时,它会返回所有 ID 属性的逗号分隔列表。这不等于只有一个 ID 字符串的值,除非 document 列中只有一个对象。

    您需要使用JSON_SEARCH() 在 JSON 值中搜索匹配的元素。

    SELECT * 
    FROM jobs 
    WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id');
    

    【讨论】:

    • 感谢您的解释,但是使用 json_search 仍然返回 0 行
    • 很遗憾,我没有要测试的 MySQL 5.7 实例。
    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2015-02-11
    • 1970-01-01
    • 2020-12-24
    • 2021-09-06
    相关资源
    最近更新 更多