【问题标题】:Can't detect null value from JSON_EXTRACT无法从 JSON_EXTRACT 检测空值
【发布时间】:2017-05-01 11:55:51
【问题描述】:

我有一个数据库,其中有一个存储在 JSON 列中的数据数组。我需要在 JSON 数组中的特定位置找到所有具有空值的值。虽然用JSON_EXTRACT 提取数据似乎微不足道,但我与 null 的比较都没有奏效,他们都声称该值为 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 中提取的空值是否有一些关键?

【问题讨论】:

  • 有什么问题...WHERE (JSON_EXTRACT(COLUMNS_HEADERS, '$[1]') is NULL;比较?

标签: mysql


【解决方案1】:

好吧,我有一个怀疑,但我找到了一种解决方法,可以确认 JSON 空值与 MySQL 空值不同。

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

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

这似乎是一种糟糕的形式,但这是我获得与数组中的空值相等的值的唯一方法。

【讨论】:

    【解决方案2】:
    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 的文档。

    【讨论】:

      【解决方案3】:

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

      诀窍是与字符串 'NULL' 进行比较,而不是 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        相关资源
        最近更新 更多