【问题标题】:Failed to find conversion function from unknown to text找不到从未知到文本的转换函数
【发布时间】:2013-08-07 02:08:23
【问题描述】:

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

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)

【问题讨论】:

  • ::text 对我不起作用。这个解决方案确实做到了,将“文本”放在文本文字之前:stackoverflow.com/a/25193282/349169
  • 使用 PostgreSQL 9.6 会引发异常,但使用 PostgreSQL 10 及更高版本可以工作......(检查db-fiddle.com

标签: postgresql postgresql-9.1 postgresql-9.2


【解决方案1】:

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

有一些提议尝试使用任何未知的文字常量,例如文本常量,但由于更多原因被拒绝。因此,我预计该领域不会发生重大变化。这个问题通常与综合测试有关 - 而不是与实际查询有关,其中类型是从列类型推导出来的。

【讨论】:

  • 我明白了。我在现实生活中经常遇到这个问题。我们正在使用 PostgreSQL 进行分析/双向/数据挖掘,并且无类型常量的联合很常见。但正如我所说,它很容易投射。
  • 为什么我不必像 1::int 这样强制转换数字文字?
  • @IainElder - 数字类型是较小的类 - 任何文字常量(命名为“未知”)都可以隐式转换为任何类型 - 数字不是 - 所以 sin('2.34') 有效,但长度(1) 不是
  • 在尝试union 结果时,我不断回到这个问题。未来的我很懒,所以我没有阅读整个问题,其中实际上包括答案:将联合值转换为文本。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多