如何将 MySQL 5.7 JSON NULL 转换为原生 MySQL NULL?

obe*_*obe 7 mysql null json casting

这段代码:

SELECT JSON_EXTRACT('{"hello": null}', '$.hello')
Run Code Online (Sandbox Code Playgroud)

返回null

但是,这不是 MySQL 本机NULL. 例如,这个:

SELECT COALESCE(JSON_EXTRACT('{"hello": null}', '$.hello'), 'world')
Run Code Online (Sandbox Code Playgroud)

也产量null

如何将此 JSON 转换null为 MySQL 本机NULL

我想我可以使用IF一些比较,但它似乎不是正确的方法......

ser*_*ius 11

不幸的CAST('{}' AS JSON)是,在这种情况下不起作用,但NULLIF有效:

  1. 完整方法:

    SELECT NULLIF(JSON_UNQUOTE(JSON_EXTRACT('{"hello": null}', '$.hello')), 'null') IS NULL;

  2. 短路:

    SELECT NULLIF(helloColumn ->> '$.hello', 'null') IS NULL IS NULL;


gee*_*vdk 6

这个问题是关于MySQL 5.7的,但我想添加MySQL 8.0的解决方案。

在 MySQL 8.0.21 中,我们现在可以使用该JSON_VALUE函数(SQL 标准的一部分)来提取值并可选择将其转换为 (MySQL) 类型。

mysql> SET @doc = '{"a": null}';

mysql> SELECT JSON_VALUE(@doc, '$.a' RETURNING SIGNED);
+------------------------------------------+
| JSON_VALUE(@doc, '$.a' RETURNING SIGNED) |
+------------------------------------------+
|                                     NULL |
+------------------------------------------+

mysql> SET @doc = '{"a": 2}';

mysql> SELECT JSON_VALUE(@doc, '$.a' RETURNING SIGNED);
+------------------------------------------+
| JSON_VALUE(@doc, '$.a' RETURNING SIGNED) |
+------------------------------------------+
|                                        2 |
+------------------------------------------+
Run Code Online (Sandbox Code Playgroud)