json - 为什么 JSON null 不在 postgres 中转换为 SQL null?

标签 json postgresql casting null

所以下面的 PostgreSQL 片段返回 null,因为它应该:

select ('{"id": null}'::json->'id')

直觉上,人们会期望以下语句返回 null 或一个空字符串:

select ('{"id": null}'::json->'id')::TEXT

相反,它返回字符串“null”。为什么?

此外,

select ('{"id": null}'::json->'id')::INTEGER

返回 cannot cast type json to integer

select ('{"id": null}'::json->'id')::TEXT::INTEGER

返回 整数的无效输入语法:“null”。 (此处的用例是将 JSON 空值转换为 INTEGER 列中的 SQL 空值。)

有一个 similar question有一个有点难以理解的答案,似乎可以归结为“JSON 空值和 SQL 空值略有不同”,没有进一步的解释。有人可以帮助我了解这里发生了什么吗?这种明显的行为看起来很疯狂!

如何干净利落地解决这个问题?测试字符串“null”的代码发出尖叫声,在转换之前重构以测试每个潜在节点是否为 null/“null”同样令人厌恶。还有其他想法吗?

最佳答案

使用 ->> 运算符检索 json 字段。

这应该有效并为两者正确返回 null(如无值):

select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer

我已经 made a fiddle证明它

PS:要获取字符串 "null",您需要将 json 定义为:{"id": "null"}

关于json - 为什么 JSON null 不在 postgres 中转换为 SQL null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39172873/

相关文章:

json - 使用 Doctrine2 请求 JSON 类型字段中的键/值

postgresql - 如何优化 Postgres 中按插入顺序排序的查询表

node.js - 我应该在哪里使用 done()

c++ - 如何在C++中绑定(bind)变量

javascript - 访问 javascript 数组中的不同元素

c# - 如何使用System.Text.Json将json数组转换为集合;

mysql - 最适合高分榜的数据库类型

c# - casting三元表达式如何解决溢出编译错误

c++ - 如何在 C++11 constexpr 中检查 double 的位模式是 0x0?

javascript - 从客户端 JavaScript AJAX 调用 WebAPI GET 方法,出现错误