JSON 包含空数组的 MySQL

lsi*_*tti 2 mysql sql json

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

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

WHERE JSON_CONTAINS(config, '', '$.tier') = 1
Run Code Online (Sandbox Code Playgroud)

或者

WHERE JSON_CONTAINS_PATH(config, 'one', '$.tier') = NULL
Run Code Online (Sandbox Code Playgroud)

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

我专门四处寻找答案,但在 SO 或 MySQL 文档上找不到任何内容。

Bil*_*win 7

这里有两种方法可以做到,在 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": []} |
+--------------+
Run Code Online (Sandbox Code Playgroud)

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

首先,看到我有两行,其中一行有一个非空数组:

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)
Run Code Online (Sandbox Code Playgroud)

现在我确保数组的长度为 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)
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 5

如果tier保证是一个数组,您可以使用以下命令检查第 0是否存在JSON_CONTAINS_PATH

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
Run Code Online (Sandbox Code Playgroud)

或者使用JSON_LENGTH

SELECT JSON_LENGTH('{"tier": []}',             '$.tier'); -- 0
SELECT JSON_LENGTH('{"tier": ["foo"]}',        '$.tier'); -- 1
SELECT JSON_LENGTH('{"tier": ["foo", "bar"]}', '$.tier'); -- 2
Run Code Online (Sandbox Code Playgroud)