Postgres encode()函数不能与作为参数的函数一起使用

时间:2019-07-04 11:01:57

标签: postgresql postgres-9.6

我正在尝试使用Postgresql encode()函数,并将其他一些函数用作参数。我收到错误,但我不明白为什么。

我正在Windows上使用Postgres 9.6.14。

  1. 这可以正常工作并返回698d51a19d8a121ce581499d7b701668
select md5('111'); 
  1. 这也可以正常工作并返回一些值
select encode('698d51a19d8a121ce581499d7b701668', 'base64');
  1. 但是这个结合了前2个的代码无效,并返回"ERROR: function encode(text, unknown) does not exist"
select encode(md5('111'), 'base64');
  1. 这也不起作用,并返回相同的错误
select encode(concat('1', '11'), 'base64');
  1. 我认为有一条规则可以防止在另一个函数中使用一个函数,但是下面一个函数可以正常工作,并且按预期返回与第一个请求相同的值。
select md5(concat('1', '11'))

那么,请求号3和4以及encode()的总体功能是什么?

1 个答案:

答案 0 :(得分:3)

看看encode的定义:

\df encode
                          List of functions
   Schema   |  Name  | Result data type | Argument data types | Type 
------------+--------+------------------+---------------------+------
 pg_catalog | encode | text             | bytea, text         | func
(1 row)

第一个参数必须为bytea,即二进制字节串。

您的前两个查询有效,因为字符串文字的类型为unknown,可以将其隐式转换为bytea

在不起作用的查询中,您正在使用函数md5concat,它们的结果类型均为text。现在textbytea之间没有隐式强制转换,因此出现错误消息。

要使其工作,必须引入一个显式的类型转换:

select encode(CAST(md5('111') AS bytea), 'base64');