丢失的JSON密钥提取为SQL
NULL
.
mysql> select json_extract('{"project":null}', '$.xyzzy') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
JSON
null
值未提取到SQL
无效的
。它将作为标量值的JSON文档提取
'null'
.
mysql> select json_extract('{"project":null}', '$.project') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 0 |
+------------+
JSON_UNQUOTE()
不转换JSON值
无效的
转换为SQL
无效的
。它将其转换为SQL字符串值
无效的
.
mysql> select json_unquote(json_extract('{"project":null}', '$.project')) is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 0 |
+------------+
因此,您生成的列正在尝试解析字符串值
无效的
将其强制转换为整数,在严格模式(默认模式)下失败:
mysql> select cast('null' as signed) as bad_integer;
+-------------+
| bad_integer |
+-------------+
| 0 |
+-------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1292): Truncated incorrect INTEGER value: 'null'
您可以通过将该字符串值与
无效的
并以这种方式替换SQL NULL:
mysql> select nullif(json_unquote(json_extract('{"project":null}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
但这与JSON字符串值无法区分
无效的
:
mysql> select nullif(json_unquote(json_extract('{"project":"null"}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
| 1 |
+------------+
基本上,当JSON与SQL结合在一起时,它就是一团乱麻。有太多的边缘案例以反直觉的方式表现,我不得不说这是多年来添加到SQL中最糟糕的功能。