为什么 JSON null 在 postgres 中没有转换为 SQL null?

Tom*_*lis 6 postgresql null json casting

因此,以下 PostgreSQL 代码段将返回null,因为它应该:

select ('{"id": null}'::json->'id')
Run Code Online (Sandbox Code Playgroud)

直观地,人们会期望以下语句返回null或空字符串:

select ('{"id": null}'::json->'id')::TEXT
Run Code Online (Sandbox Code Playgroud)

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

此外,

select ('{"id": null}'::json->'id')::INTEGER
Run Code Online (Sandbox Code Playgroud)

返回cannot cast type json to integer

select ('{"id": null}'::json->'id')::TEXT::INTEGER
Run Code Online (Sandbox Code Playgroud)

返回invalid input syntax for integer: "null"。(这里的用例是将 JSON null 转换为 INTEGER 列中的 SQL null。)

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

如何干净利落地解决这个问题?测试字符串“null”的代码很臭,并且在转换之前重构以测试每个潜在节点的 null/“null”同样令人讨厌。还有其他想法吗?

Jcl*_*Jcl 7

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

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

select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer
Run Code Online (Sandbox Code Playgroud)

我做了一个小提琴来演示它

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