83

在我的一个选择语句中,我遇到了以下错误:

ERROR:  failed to find conversion function from unknown to text
********** Error **********
ERROR: failed to find conversion function from unknown to text
SQL state: XX000

这很容易使用 修复cast,但我不完全理解它为什么会发生。我将用两个简单的陈述来说明我的困惑。

这个没问题:

select 'text'
union all
select 'text';

这将返回错误:

with t as (select 'text')    
select * from t
union all
select 'text'

我知道我可以轻松修复它:

with t as (select 'text'::text)    
select * from t
union all
select 'text'

为什么在第二个示例中转换失败?是否有一些我不明白的逻辑,或者这将在未来版本的 PostgreSQL 中修复?

PostgreSQL 9.1.9

PostgreSQL 9.2.4 上的相同行为(SQL Fiddle

4

1 回答 1

77

Postgres 很高兴,如果它可以从上下文中检测到无类型常量的类型。但是当任何上下文都不可能时,并且当查询比琐碎复杂一点时,这种机制就会失败。这些规则特定于任何 SELECT 子句,有些更严格,有些则不是。如果我可以说,那么旧例程更宽容(由于与 Oracle 更高的兼容性并且对初学者的负面影响更小),现代例程更不宽容(由于对类型错误的更高安全性)。

有一些建议尝试使用任何未知的文字常量,如文本常量,但由于更多原因被拒绝。因此,我预计该领域不会发生重大变化。这个问题通常与综合测试有关 - 而不是真正的查询,其中类型是从列类型推导出来的。

于 2013-08-06T09:33:08.817 回答