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有效:
完整方法:
SELECT NULLIF(JSON_UNQUOTE(JSON_EXTRACT('{"hello": null}', '$.hello')), 'null') IS NULL;
短路:
SELECT NULLIF(helloColumn ->> '$.hello', 'null') IS NULL IS NULL;
这个问题是关于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)