问题 错误:未能找到从未知到文本的转换函数


PostgreSQL上有一个错误,它给我的一个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

我的查询看起来像这样:

Select * 
from (select 'string'  as Rowname, Data
      From table)
Union all
     (select 'string2' as Rowname, Data
      From table)

这样做的目的是指定行在一个点上的位置。字符串是行的名称。这是我想要的输出:

Rowname Data 
string  53
string2 87

有没有办法解决这个错误?


11619
2017-08-07 21:45


起源

postgresql通常不像Oracle(例如)那样需要FROM子句 - Andrew Wolfe


答案:


你的陈述有几个问题。但错误消息暗示您需要一个 显性演员 声明字符串文字的(但未知的)数据类型 'string'

SELECT 'string'::text AS rowname, data FROM tbl1

UNION ALL
SELECT 'string2', data FROM tbl2

这仅适用于a的第一个SELECT UNION 查询。后来的腿已经知道每列的名称和类型。

在其他情况下(如 INSERTPostgres可以从目标列派生数据类型,并尝试自动强制转换为正确的数据类型。


15
2017-08-07 22:26



为什么Postgresql要我们严格写这个类型? AFAIK,它应该使用第一个查询来确定UNION语句的类型,并且Postgresql中没有其他类型被定义为'anythingOtherThanQuote'。是因为Postgresql不够聪明,无法推断出类型或设计决策? - burak emre
@burakemre:你好像错过了 rowname 不是来自任何东西,而是一个真正的新专栏。所以不能推断出这种类型。 - Erwin Brandstetter
我不明白为什么Postgresql不能执行这个查询:“SELECT * FROM(SELECT'string')一个UNION ALL SELECT'string2'”,当我取出UNION ALL部分时,它按预期工作。 Postgresql已经知道字符串文字,我希望Postgresql使用“text”类型作为字符串文字'string'。你能解释一下我在这里缺少什么吗? - burak emre