微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 我有一个以奇怪的方式失败的删除插入CTE

这是它成功的一个例子:
with x as ( 
    delete from common.companies where id = '0f8ed160-370a-47bb-b4bf-2dcf79100a52' 
    returning row_to_json(companies) as old_data,null as new_data,'common.companies' as model,id,'delete' as action)
insert into edit_history (old_data,new_data,model,model_pk,action,submitter)
select old_data,null,'0b392013-f680-45a6-b19a-34f3d42d0120' from x;

INSERT 0 1

请注意,insert-select中的第二列是explicity null.

这是一个失败的例子:

with x as (
    delete from common.companies where id = '160d7ef2-807c-4fe0-bfed-7d282c031610' 
    returning row_to_json(companies) as old_data,submitter)                                                                   
select old_data,'0b392013-f680-45a6-b19a-34f3d42d0120' from x;

ERROR:  Failed to find conversion function from unkNown to json

请注意,在此示例中,我没有第二列中的显式null,而是new_data,它从delete语句返回为null.

如果两个值都为null,为什么第二个示例会破坏我的错误?我仔细考虑过,这是唯一的功能差异.

解决方法

在第一个示例中,您为INSERT语句提供了一个尚未类型化的NULL.

在第二个示例中,您提前一步提供NULL(在CTE中),必须键入表达式并为其指定类型unkNown.对于其他constants(如数字常量:123),Postgres可以派生出更合适的认数据类型,但NULL(或字符串文字’foo’)可以是任何东西.并且在unkNown和json之间没有定义类型转换.

将NULL转换为CTE中的正确数据类型以避免出现问题(正如您现在所发现的那样).
或者如果为时已晚,可以使用文字作为铸造链中的垫脚石.一切都可以转换成文本.

您可以将演示简化为以下内容

作品:

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;

原文地址:https://www.jb51.cc/mssql/83252.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐