web-dev-qa-db-ja.com

MySQLでオブジェクトの配列を使用してJSON列をクエリする

次の配列を持つjson列があります:

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

次のクエリを実行して、ドキュメント列に24276e4b-de81-4c2c-84e7-eed9c3582a31というIDが含まれる行を取得しようとしましたが、結果が返されません。

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

誰でも正しいクエリを行う方法を知っていますか?

18
Fabrício

私はmysql 5.7を使用しているため、JSON_CONTAINSは次のように簡単に使用できます。

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

このようにしてみてください:

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であることを覚えておくのは簡単ですが、文字列やその他のことは覚えていません。

6
Mr.Sheng

多分これ? @Barmar

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

_document->'$[*].id'_を使用すると、すべてのIDプロパティのコンマ区切りのリストが返されます。 document列にオブジェクトが1つしかない場合を除いて、これは1つのID文字列の値とは異なります。

JSON値内で一致する要素を検索するには、JSON_SEARCH()を使用する必要があります。

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