我有一个数据库,其中包含存储在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中提取的空值?
答案 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;
这看起来像是糟糕的形式,但是我唯一能得到一个评估为等于数组中空值的值的方法。