postgresql - 为什么将 JSONb NULL 转换为类型失败,这是一个规范错误?

标签 postgresql casting jsonb

commented in this answer ,

SELECT (j->'i')::int FROM  (SELECT '{"i":null}'::jsonb) t(j); -- fail

结果“错误:无法将 jsonb null 转换为整数类型”...好吧,这是“PostgreSQL 方式”,但是为什么不让它变得更好呢?比添加 CASE 子句更好,它正在做“自然”的事情,即将 JSON-NULL 值转换为 SQL 类型的 null 值。所以,这不是一个实现问题,但它似乎是 PostregSQL 中的一个规范错误:是吗?

最佳答案

原因是 SQL NULL 与 JSON null 有很大不同。

如果你想这样做:

SELECT nullif((j->'i'), 'null')::int FROM  (SELECT '{"i":null}'::jsonb) t(j);
 nullif 
--------
   NULL
(1 row)

 SELECT pg_typeof(nullif((j->'i'), 'null')::int) FROM  (SELECT '{"i":null}'::jsonb) t(j);
 pg_typeof 
-----------
 integer


SELECT nullif((j->'i'), 'null')::int FROM  (SELECT '{"i": 1}'::jsonb) t(j);
 nullif 
--------
      1
(1 row)

使用NULLIF将 JSON null 转换为 SQL NULL

关于postgresql - 为什么将 JSONb NULL 转换为类型失败,这是一个规范错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69995304/

相关文章:

postgresql - 在 PostgreSQL 中使用 dblink 时如何包含模式 inf?

node.js - 根据日志,Heroku 应用程序不断崩溃......为什么?

ruby-on-rails - 在 Postgres JSONB 列中按数字排序

java - 通过 JDBC 恢复包含 "COPY"的 pg_dump 文件

sql - 如何确保 Column_A 仅在 Column_B 为 NULL 时才有值?反之亦然

java - 如何将 cursorLoader 转换为 Loader<Object>

java - 未经检查强制转换为实现 Map<String, V> 的泛型类

java - 一种更优雅的转换方式

Postgresql 和 jsonb : WHERE <a specific nested field in my json> IS NOT NULL

sql - 错误: cannot call jsonb_to_recordset on a non-array (postgresql)