所以下面的 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/