找不到从未知到文本的转换功能


77

在我的选择语句之一中,出现以下错误:

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'

为什么在第二个示例中转换失败?是否有一些我不理解的逻辑,或者在将来的Pos​​tgreSQL版本中将解决此问题?

PostgreSQL 9.1.9

PostgreSQL 9.2.4(SQL Fiddle)上的行为相同


::text没有为我工作。此解决方案确实做到了,将“ text”放在文本文字之前:stackoverflow.com/a/25193282/349169
Chris

使用PostgreSQL 9.6会引发异常,但是使用PostgreSQL 10及以上版本仍然可以...(已通过db-fiddle.com进行了检查
kaaas

Answers:


72

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

有一些建议尝试使用任何未知的文字常量(例如文本常量),但由于更多原因而被拒绝。因此,我预计这方面不会发生重大变化。此问题通常与综合测试有关,而与实际查询(涉及从列类型推断出类型)较少相关。


5
我懂了。我在现实生活中经常遇到这个问题。我们正在使用PostgreSQL进行分析/双向/数据挖掘,无类型常量的并集很常见。但是正如我所说,这很容易投射。
Tomas Greif

3
为什么我不必强制转换数字文字1::int呢?
伊恩·塞缪尔·麦克莱恩

1
@IainElder-数字类型是较小的类-任何文字常量(命名为“未知”)都可以隐式转换为任何类型-数字不能使用-所以sin('2.34')有效,但是length(1)无效
Pavel Stehule

4
在尝试union得出结果时,我不断回到这个问题。而且未来我很懒,因此我不会阅读整个问题,实际上包括答案:将并集值转换为文本。
samthebrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.