28

我有一个带有以下数组的 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"

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

4

4 回答 4

36

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

SELECT JSON_CONTAINS(
                '[{"id": "24av","name": "she"},{"id": "e0c2", "name": "another_she"}]', 
                JSON_OBJECT('id', "e0c2")
                );
于 2017-10-06T05:45:22.853 回答
15

试试这样:

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但不是字符串或其他东西;

于 2017-05-18T07:44:21.480 回答
1

也许这个?@Barmar

SELECT * FROM jobs WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id') IS NOT NULL;
于 2019-07-18T10:09:19.263 回答
0

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

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

SELECT * 
FROM jobs 
WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id');
于 2016-08-05T21:42:46.560 回答