MySQL,其中JSON包含空数组

MySQL,其中JSON包含空数组,mysql,sql,json,Mysql,Sql,Json,如何在JSON列中搜索空数组 假设我有一个config列,它的JSON有时等于{“tier”:[]} WHERE JSON_CONTAINS(config, '', '$.tier') = 1 或 没有返回任何结果。 有什么我遗漏的吗 我已经到处寻找了这个问题的具体答案,但我在SO或MySQL文档中找不到任何东西 这里有两种方法,在MySQL 5.7.24上测试: mysql 5.7.24> select config from mytable where json_contain

如何在JSON列中搜索空数组

假设我有一个
config
列,它的JSON有时等于
{“tier”:[]}

WHERE JSON_CONTAINS(config, '', '$.tier') = 1

没有返回任何结果。 有什么我遗漏的吗


我已经到处寻找了这个问题的具体答案,但我在SO或MySQL文档中找不到任何东西

这里有两种方法,在MySQL 5.7.24上测试:

mysql 5.7.24> select config from mytable 
  where json_contains(config, cast('[]' as json), '$.tier');
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+

mysql 5.7.24> select config from mytable 
  where json_contains_path(config, 'one', '$.tier');
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+

我找到了另一个解决方案,它有助于严格检查空数组:

mysql 5.7.24> select config from mytable 
  where json_contains(config, json_array(), '$.tier');
+----------------------------------------+
| config                                 |
+----------------------------------------+
| {"tier": []}                           |
| {"tier": [{"name": "BK", "value": 8}]} |
+----------------------------------------+
2 rows in set (0.00 sec)
首先,我有两行,其中一行是非空数组:

mysql 5.7.24> select config from mytable 
  where json_contains(config, json_array(), '$.tier');
+----------------------------------------+
| config                                 |
+----------------------------------------+
| {"tier": []}                           |
| {"tier": [{"name": "BK", "value": 8}]} |
+----------------------------------------+
2 rows in set (0.00 sec)
现在,我确保数组的长度为0,以确认它为空:

mysql 5.7.24> select config from mytable 
  where json_contains(config, json_array(), '$.tier') 
  and json_length(config, '$.tier') = 0; 
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+
1 row in set (0.00 sec)

如果
保证为数组,则可以使用以下方法检查第0项是否存在:

交替使用:


嗯,有没有办法做一些严格的检查?如果我的
config
列还包含
{“tier”:[{“name”:“BK”,“value”:8}]}
则这些记录将显示在结果中以及空数组中。
SELECT JSON_CONTAINS_PATH('{"tier": []}',             'one', '$.tier[0]'); -- 0
SELECT JSON_CONTAINS_PATH('{"tier": ["foo"]}',        'one', '$.tier[0]'); -- 1
SELECT JSON_CONTAINS_PATH('{"tier": ["foo", "bar"]}', 'one', '$.tier[0]'); -- 1
SELECT JSON_LENGTH('{"tier": []}',             '$.tier'); -- 0
SELECT JSON_LENGTH('{"tier": ["foo"]}',        '$.tier'); -- 1
SELECT JSON_LENGTH('{"tier": ["foo", "bar"]}', '$.tier'); -- 2