在第一个示例中,您为语句提供了一个 NULL INSERT
。
在第二个示例中,您较早一步(在CTE中)提供NULL,则必须键入表达式并为其指定type unkNown
。对于其他 (例如数字常量123
:),Postgres可以派生更合适的默认数据类型,但NULL(或字符串文字'foo'
)可以是 任何东西 。并且在unkNown
和之间没有定义类型转换json
。
在CTE中将NULL强制转换为正确的数据类型可以避免该问题(如您现在所知)。 或者text
为时已晚,在铸造链中用作垫脚石。一切都可以投射到/投射出来text
。
您可以将演示简化为以下内容:
作品:
SELECT NULL::json;
失败:
SELECT new_data::json
FROM (SELECT NULL AS new_data) t;
再次工作:
SELECT new_data
FROM (SELECT NULL::json AS new_data) t;
或者:
SELECT new_data::text::json
FROM (SELECT NULL AS new_data) t;