admin

JSON包含空数组的MySQL

sql

如何在JSON列中搜索空数组?

假设我有一config列有时具有JSON等于的列{"tier": []}

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

或者

WHERE JSON_CONTAINS_PATH(config, 'one', '$.tier') = NULL

没有返回任何结果。有什么我想念的吗?

我一直在四处寻找有关此问题的答案,但在SO或MySQL文档上找不到任何内容。


阅读 148

收藏
2021-06-07

共1个答案

admin

在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)

现在,我确保数组的长度为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)
2021-06-07