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

时间:2016-08-26 18:43:12

标签: 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

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

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

如何干净利落地解决这个问题?测试代码的字符串“null”尖叫声,并且在强制转换之前重构以测试每个潜在节点的null /“null”同样糟糕。还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

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

这应该可以正常工作并为两者正确地返回null(如同,没有值)

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

made a fiddle说明了它

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

答案 1 :(得分:1)

您可能需要使用json_typeof运算符来确定由 - >

返回的JSON类型中的内容

选择json_typeof(' {" id":4}' :: json->' id'),json_typeof(' {& #34; id":" null"}' :: json->' id'),json_typeof(' {" id&# 34;:null}' :: json->' id')

使用 - >>相反,保证你一个文本字符串值,但你不能区分null和" null"