2016-12-15 117 views
0

我有一個數據庫,其中存儲了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拉出?

回答

3
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

0

好吧,我有一個懷疑,但我發現一個解決方法,確認JSON空值不是一個MySQL空值相同。

我嘗試了各種方法來獲得類似的空值,但唯一可行的是從像我試圖要檢查的數值數組提取空JSON值:

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

這似乎像糟糕的形式,但是我能得到一個值與我的數組中的空值相等的唯一方法。

0

有點遲來的答案,但我只是遇到了這個問題,找不到任何合理的文件。我結束使用的解決方案是上面指出的'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)