如何在JSON列中搜索空数组?
假设我有一个config
列,有时其JSON等于{"tier": []}
。
WHERE JSON_CONTAINS(config, '', '$.tier') = 1
或
WHERE JSON_CONTAINS_PATH(config, 'one', '$.tier') = NULL
不返回任何结果。 有什么我想念的吗?
我一直在寻找具体的答案,但是在SO或MySQL文档上找不到任何东西。
答案 0 :(得分:1)
有两种方法可以在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)
答案 1 :(得分:1)
如果保证tier
是一个数组,则可以使用JSON_CONTAINS_PATH
检查是否存在0 th 项:
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
或者使用JSON_LENGTH
:
SELECT JSON_LENGTH('{"tier": []}', '$.tier'); -- 0
SELECT JSON_LENGTH('{"tier": ["foo"]}', '$.tier'); -- 1
SELECT JSON_LENGTH('{"tier": ["foo", "bar"]}', '$.tier'); -- 2