所以下面的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”同样糟糕。还有其他想法吗?
答案 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"