Tom*_*eif 64 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
Run Code Online (Sandbox Code Playgroud)
这很容易修复使用cast,但我不完全理解为什么会发生.我将用两个简单的陈述说明我的困惑.
这个没关系:
select 'text'
union all
select 'text';
Run Code Online (Sandbox Code Playgroud)
这将返回错误:
with t as (select 'text')
select * from t
union all
select 'text'
Run Code Online (Sandbox Code Playgroud)
我知道我可以轻松解决它:
with t as (select 'text'::text)
select * from t
union all
select 'text'
Run Code Online (Sandbox Code Playgroud)
为什么第二个例子中的转换失败?是否有一些我不理解的逻辑或者这将在PostgreSQL的未来版本中修复?
PostgreSQL 9.1.9
PostgreSQL 9.2.4(SQL小提琴)上的相同行为
Pav*_*ule 59
Postgres很高兴,如果它可以从上下文中检测类型的无类型常量.但是当任何上下文不可能时,并且当查询比普通的更复杂时,那么这种机制就会失败.这些规则特定于任何SELECT子句,有些是更严格的,有些则不是.如果我可以说,那么旧的例程更容忍(由于与Oracle的兼容性更高,对初学者的负面影响更小),现代的容忍度更低(因为类型错误的安全性更高).
有些提案尝试使用任何未知的文字常量,如文本常量,但由于更多原因被拒绝.所以我不希望这个领域发生重大变化.此问题通常与合成测试相关 - 而不是真实查询,其中类型是从列类型推断出来的.