无法找到从未知到文本的转换函数

时间:2013-08-06 07:15:53

标签: postgresql postgresql-9.1 postgresql-9.2

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

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

上的相同行为

1 个答案:

答案 0 :(得分:57)

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

有些提案尝试使用任何未知的文字常量,如文本常量,但由于更多原因被拒绝。所以我不希望这个领域发生重大变化。此问题通常与合成测试相关 - 而不是真实查询,其中类型是从列类型推断出来的。