

MySQL 5.7以降で次のようなテーブルJSONを入れています。

[code]

    CREATE TABLE `p` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `parameter` json NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
    
    INSERT INTO `p` (`id`, `parameter`) VALUES (1,'[{\"a\": \"hoge\", \"parameter\": {\"m\": 4, \"i\": 5}, {\"a\": \"fuga\", \"parameter\": {\"apple\": \"red\"}}]');
    
[/code]

ここで新規データが来たときに、parameterと完全一致で検索をしたいのですが、どうすればいいでしょうか？`JSON_CONTAINS`を使ってみたのですが、これは部分検索なので`[{\"a\":
\"fuga\", \"parameter\": {\"apple\":
\"red\"}}]`というデータが来た場合にも1がヒットしていまいます。しかし1がヒットしてほしいのは`[{\"a\": \"hoge\",
\"parameter\": {\"m\": 4, \"i\": 5}, {\"a\": \"fuga\", \"parameter\":
{\"apple\": \"red\"}}]`が来た場合のみです。

事前に`JSON_EXTRACT +
CAST`での文字列検索も試したのですが、JSON_EXTRACTで取り出される配列はkeyの順番が壊れてしまい、上手くいきませんでした。


CC BY-SA 4.0
2018-09-18T12:30:12.407
48511
2018-09-21T14:21:20.433
30157
question
mysql sql json
MySQLにあるJSONへの完全一致検索


まず、質問文の json は`}`が一つ足りないので、 json として不正な形式です。

それを直してテストを行ったところ、 OOPer さんのおっしゃっている通り、 json 型のデータを `=` で条件指定することで、以下のように、データを
json 構造の比較で select することができました。

[code]

    with entries(id, parameter) as (
      select 1, cast('[{"a": "hoge", "parameter": {"m": 4, "i": 5}}, {"a": "fuga", "parameter": {"apple": "red"}}]' as json)
    )
    select * from entries
      where parameter = cast('[{"a": "hoge", "parameter": {"i": 5, "m": 4}}, {"parameter": {"apple": "red"}, "a": "fuga"}]' as json)
    \G
    
[/code]

### 出力

[code]

    *************************** 1. row ***************************
           id: 1
    parameter: [{"a": "hoge", "parameter": {"i": 5, "m": 4}}, {"a": "fuga", "parameter": {"apple": "red"}}]
    
[/code]


CC BY-SA 4.0
2018-09-21T14:21:20.433
48627
2018-09-21T14:21:20.433
754
48511
answer