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
有什么可能的方法来修复这个错误吗?
更新: Postgres 更高版本中的类型解析变得更加智能,UNION、CASE 和相关构造的规则将其解析为文本,无需显式强制转换:
- 如果所有输入的类型均为未知,则解析为类型
(字符串类别的首选类型)。 [...]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 从目标列派生数据类型并尝试自动强制为正确的类型。
Select * from (select CAST('string' AS text) as Rowname, Data
From table) Union all
(select CAST('string2' AS text) as Rowname, Data
From table)
使用
.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)