无法从JSON_EXTRACT检测空值

Fr3*_*dan 6 mysql

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

这是我应该告诉的示例代码:

SELECT JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') , (JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') is null)
FROM ate.readings_columns_new;
Run Code Online (Sandbox Code Playgroud)

我的结果表的前几行看起来像这样:

null                    |   0
"INTERNALTEMPERATURE"   |   0
"INPUT_VOLTAGE"         |   0
null                    |   0
null                    |   0
"AH1"                   |   0
Run Code Online (Sandbox Code Playgroud)

我已经尝试了我能想到的每一个比较,它们都会产生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')
Run Code Online (Sandbox Code Playgroud)

是否有一些关键来比较从JSON_EXTRACT拉出的空值?

abl*_*abl 17

SELECT 
  JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]'), 
  (JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]') = CAST('null' AS JSON))
FROM ate.readings_columns_new;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT 
  JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]'), 
  (JSON_TYPE(JSON_EXTRACT(`COLUMNS_HEADERS`, '$[1]')) = 'NULL')
FROM ate.readings_columns_new;
Run Code Online (Sandbox Code Playgroud)

请参阅JSON_TYPE的文档.


Bre*_*mas 5

有点迟来的答案,但我刚刚遇到这个问题,找不到任何合理的记录。我最终使用的解决方案是上面指出的json_type函数。

诀窍是与字符串“NULL”进行比较,而不是 null 或 NULL。

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

(如果使用 phpMyAdmin,请不要忘记选中“再次在此处显示此查询”和“保留查询框” - 宇宙已经足够令人沮丧了,而不会丢失编辑..)

set @a='{"a":3,"b":null}';

select if(json_type(json_extract(@a,'$.b')) = 'NULL',1,0);
Run Code Online (Sandbox Code Playgroud)

我最终得到以下结果。

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

作为存储过程的基本框架(这正是我需要它的目的),使用“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)
Run Code Online (Sandbox Code Playgroud)