web-dev-qa-db-ja.com

JSON配列として保存されたデータの行をフィルタリングする

私のデータは次のように保存されます

_________________________________
id | category    | other data etc
--------------------------------
 1 | ["2","3"]   |bla bla
--------------------------------
 2 | ["254","34"]|bla bla
--------------------------------
 3 | ["11","25"] |bla bla
_________________________________

category= 11の行を選択します。どのSQLクエリを使用すればよいですか?

2
rajeevvishva

MySQL 5.7を使用していて、category列が JSON datatype を使用している場合を除いて、これを実際に行うことはできません。そうであれば、 JSON_CONTAINS 関数を使用できます。

SELECT * FROM `yourtable`
WHERE JSON_CONTAINS(category, '"11"')

封じ込めのルールに注意してください:

  • 候補スカラーは、それらが同等であり等しい場合に限り、ターゲットスカラーに含まれます。 2つのスカラー値は、それらが同じJSON_TYPE()タイプであれば比較可能ですが、タイプINTEGERおよびDECIMALの値も互いに比較可能です。

  • 候補配列は、候補のすべての要素がターゲットのいくつかの要素に含まれている場合にのみ、ターゲット配列に含まれます。

  • 候補の非配列は、候補がターゲットのいくつかの要素に含まれている場合にのみ、ターゲット配列に含まれます。

  • 候補オブジェクトは、候補の各キーについてターゲットに同じ名前のキーがあり、候補キーに関連付けられた値がターゲットキーに関連付けられた値に含まれている場合に限り、ターゲットオブジェクトに含まれます。

このデータセットのデータ型に関する問題を確認できます。

CREATE TABLE myjson (
  id tinyint unsigned primary key auto_increment,
  category JSON
);

mysql> SELECT * FROM myjson;
+----+---------------+
| id | category      |
+----+---------------+
|  1 | ["2", "3"]    |
|  2 | ["254", "34"] |
|  3 | ["11", "25"]  |
|  4 | [2, 11]       |
+----+---------------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM `myjson` WHERE JSON_CONTAINS(category, "11");
+----+----------+
| id | category |
+----+----------+
|  4 | [2, 11]  |
+----+----------+
1 row in set (0.00 sec)

mysql> SELECT * FROM `myjson` WHERE JSON_CONTAINS(category, '"11"');
+----+--------------+
| id | category     |
+----+--------------+
|  3 | ["11", "25"] |
+----+--------------+
1 row in set (0.00 sec)
5
Derek Downey