使用MySQL中的对象数组查询JSON列

Fab*_*cio 12 mysql mysql-json

我有一个带有follow数组的json列:

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

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

select * from jobs WHERE document->'$[*].id' = "24276e4b-de81-4c2c-84e7-eed9c3582a31"
Run Code Online (Sandbox Code Playgroud)

有谁知道如何做正确的查询?

Sep*_*Sep 17

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

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

  • 我不明白这是什么。为什么有一个对象数组作为第一个参数传递给 JSON_CONTAINS,而这个对象数组应该是列中的值,并且查询应该找到具有与查询匹配的参​​数的对象。这对我来说根本没有任何意义。 (2认同)
  • @John 第一个参数可以是表中的列,这里他对列值进行硬编码,以便您可以在没有任何表的情况下运行此查询。 (2认同)

Mr.*_*eng 6

尝试这样:

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

它对我有用,我认为打击的方式更有效:

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

实际上,很容易记住返回值JSON_TYPE不是String或其他值。


Gee*_*Lei 5

也许这个?@巴马尔

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


Bar*_*mar 4

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

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

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