无法从JSON_EXTRACT检测空值

时间:2016-12-15 19:10:57

标签: mysql

我有一个数据库,其中包含存储在JSON列中的数据数组。我需要找到JSON数组中特定位置具有空值的所有值。虽然使用JSON_EXTRACT提取数据似乎微不足道,但我与null的比较都没有起作用,所有这些都声称该值为空。

以下是我应该知道的示例代码:

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中提取的空值?

3 个答案:

答案 0 :(得分:13)

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的文档。

答案 1 :(得分:2)

有些迟来的答案,但我只是遇到了这个问题而无法找到合理记录的内容。我最终使用的解决方案是json_type功能为&#39; abl&#39;上面指出。

诀窍是与字符串&#39; NULL&#39;进行比较。不为null或NULL。

作为测试,将以下内容放入mysql提示符并使用值

(如果使用phpMyAdmin,请不要再次检查&#39;再次显示此查询&#39;并保留查询框&#39; - 宇宙足够令人沮丧而不会丢失编辑内容。)

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)

作为存储过程的基础 - 我需要它 - 使用&#39; if&#39;语句而不是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)

答案 2 :(得分:0)

我怀疑但是我发现了一个解决方法,确认JSON null值与MySQL null值不同。

我尝试了各种方法来获取类似的null值,但唯一有效的方法是从数组中提取null JSON值,就像我试图检查的值一样:

SELECT JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') , (JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') = JSON_EXTRACT('[null]', '$[0]'))
FROM ate.readings_columns_new;

这看起来像是糟糕的形式,但是我唯一能得到一个评估为等于数组中空值的值的方法。