过滤保存为 JSON 数组的数据的行

raj*_*hva 2 mysql json

我的数据保存为

_________________________________
id | category    | other data etc
--------------------------------
 1 | ["2","3"]   |bla bla
--------------------------------
 2 | ["254","34"]|bla bla
--------------------------------
 3 | ["11","25"] |bla bla
_________________________________
Run Code Online (Sandbox Code Playgroud)

我想选择类别=11 的行。我应该使用什么 SQL 查询?

Der*_*ney 5

除非您使用 MySQL 5.7 并且该category列使用JSON 数据类型,否则您无法真正做到这一点。如果是,您可以使用JSON_CONTAINS函数:

SELECT * FROM `yourtable`
WHERE JSON_CONTAINS(category, '"11"')
Run Code Online (Sandbox Code Playgroud)

注意收容规则:

  • 当且仅当它们可比较且相等时,候选标量包含在目标标量中。如果两个标量值具有相同的 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)
Run Code Online (Sandbox Code Playgroud)