无法find从未知到文本的转换function
在我的一个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 )
Postgres很高兴,如果它可以从上下文中检测出types的无types常量。 但是,当任何上下文是不可能的,当查询稍微复杂一点,然后这个机制失败。 这些规则对于任何SELECT子句都是特定的,有些更严格,有些则不是。 如果我可以这么说,那么较老的例程更宽容(由于与Oracle的兼容性较高,对初学者的负面影响较小),现代人较不宽容(由于types错误的安全性较高)。
有一些build议尝试使用文本常量等任何未知文字常量,但由于更多原因而被拒绝。 所以我不期望在这方面发生重大变化。 这个问题通常与综合testing相关 – 而不是真正的查询,其中types是从列types中推导出来的。