在我的一个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)
上的相同行为答案 0 :(得分:57)
Postgres很高兴,如果它可以从上下文中检测到无类型常量的类型。但是当任何上下文不可能时,并且当查询比普通的更复杂时,那么这种机制就会失败。这些规则特定于任何SELECT子句,有些是更严格的,有些则不是。如果我可以说,那么旧的例程更容忍(由于与Oracle的兼容性更高,对初学者的负面影响更小),现代的容忍度更低(因为类型错误的安全性更高)。
有些提案尝试使用任何未知的文字常量,如文本常量,但由于更多原因被拒绝。所以我不希望这个领域发生重大变化。此问题通常与合成测试相关 - 而不是真实查询,其中类型是从列类型推断出来的。