无法从JSON_EXTRACT中检测到空值
问题描述:
我有一个数据库,其中存储了JSON列中的数据数组。我需要在JSON数组中的特定位置查找具有空值的所有值。虽然用JSON_EXTRACT提取数据似乎是微不足道的,但我的比较都不成立,他们都声称值为空。无法从JSON_EXTRACT中检测到空值
下面是示例代码,应该工作,据我可以告诉:
SELECT JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') , (JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') is null)
FROM ate.readings_columns_new;
我的成绩表的前几行是这样的:
null | 0
"INTERNALTEMPERATURE" | 0
"INPUT_VOLTAGE" | 0
null | 0
null | 0
"AH1" | 0
我都想尽比较我能想到,他们都导致了一个0:
(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') is null)
(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') <=> null)
ISNULL(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]'))
(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') <=> 'null')
是否有一些关键比较空值从JSON_EXTRACT拉出?
答
SELECT
JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]'),
(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') = CAST('null' AS JSON))
FROM ate.readings_columns_new;
或
SELECT
JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]'),
(JSON_TYPE(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]')) = 'NULL')
FROM ate.readings_columns_new;
请参阅该文档为JSON_TYPE。
答
好吧,我有一个怀疑,但我发现一个解决方法,确认JSON空值不是一个MySQL空值相同。
我尝试了各种方法来获得类似的空值,但唯一可行的是从像我试图要检查的数值数组提取空JSON值:
SELECT JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') , (JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') = JSON_EXTRACT('[null]', '$[0]'))
FROM ate.readings_columns_new;
这似乎像糟糕的形式,但是我能得到一个值与我的数组中的空值相等的唯一方法。
答
有点迟来的答案,但我只是遇到了这个问题,找不到任何合理的文件。我结束使用的解决方案是上面指出的'abl'的json_type函数。
诀窍是与字符串'NULL'不为空或NULL进行比较。
作为测试引发以下到一个MySQL提示和玩的值
(如果使用phpMyAdmin不要忘记“在此再次显示此查询”检查和“保留查询框” - 宇宙令人沮丧,不会丢失编辑..)
set @a='{"a":3,"b":null}';
select if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0);
我结束了以下。
mysql> set @a='{"a":3,"b":null}';
Query OK, 0 rows affected (0.00 sec)
mysql> select if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0);
+----------------------------------------------------+
| if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0) |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (0.00 sec)
mysql> set @a='{"a":3,"b":1}';
Query OK, 0 rows affected (0.00 sec)
mysql> select if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0);
+----------------------------------------------------+
| if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0) |
+----------------------------------------------------+
| 0 |
+----------------------------------------------------+
1 row in set (0.00 sec)
作为存储过程的裸骨 - 这正是我所需要的 - 使用'if'语句而不是if()函数。
drop procedure if exists test;
delimiter $$
create procedure test(in x json)
begin
if json_type(json_extract(x,'$.b')) = 'NULL' then
select 1;
else
select 0;
end if;
end$$
delimiter;
mysql> call test('{"a":3,"b":1}');
+---+
| 0 |
+---+
| 0 |
+---+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call test('{"a":3,"b":null}');
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)