错误:找不到从未知到文本的转换函数

问题描述 投票:0回答:3

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

有什么可能的方法来修复这个错误吗?

sql database postgresql type-conversion union
3个回答
20
投票

更新: Postgres 更高版本中的类型解析变得更加智能,UNION、CASE 和相关构造的规则将其解析为文本,无需显式强制转换:

  1. 如果所有输入的类型均为未知,则解析为类型
    text
    (字符串类别的首选类型)。 [...]
SELECT 'string' AS rowname, data FROM tbl1
UNION ALL
SELECT 'string2', data FROM tbl2;

在 Postgres 9.4(?)之前的旧版本中,或者对于非默认类型,您可能仍然需要添加如下所示的显式转换。


您的陈述有几个问题。但错误消息暗示您需要 显式转换 来声明字符串文字的(尚未知)数据类型

'string'
:

SELECT text 'string' AS rowname, data FROM tbl1
UNION ALL
SELECT 'string2', data FROM tbl2;

只需输入

SELECT
查询中的一个
UNION
就足够了。通常是第一个,列名称也已确定。后续的
SELECT
未知类型列表将按顺序排列。

在其他上下文中(例如附加到

VALUES
INSERT
子句)Postgres 从目标列派生数据类型并尝试自动强制为正确的类型。


2
投票
Select * from (select CAST('string' AS text) as Rowname, Data
  From table) Union all
 (select CAST('string2' AS text) as Rowname, Data
  From table)

参考


0
投票

使用

.f2
访问匿名行的元素会出现相同的错误,如下所示:

postgres=# SELECT (ROW(2,'David',32)).f2;
ERROR:  failed to find conversion function from unknown to text

所以,我将

::VARCHAR(20)
设置在
.f2
之后,然后错误就解决了,如下所示:

postgres=# SELECT (ROW(2,'David',32)).f2::VARCHAR(20);
  f2
-------
 David
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.