无法从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)