Функция Postgres encode () не работает с функцией в качестве аргумента - PullRequest
3 голосов
/ 04 июля 2019

Я пытаюсь использовать функцию Postgresql encode () и помещаю некоторые другие функции в качестве аргументов. Я получаю ошибки и не могу понять, почему.

Я использую Postgres 9.6.14 для Windows.

  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 Ответ

3 голосов
/ 04 июля 2019

Посмотрите на определение 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 неявно.

В запросах, которые не работают, вы используете функции md5 и concat, которые оба имеют text в качестве типа результата. Теперь не существует неявного преобразования между text и bytea, отсюда и сообщение об ошибке.

Чтобы это работало, вы должны ввести явное приведение типа:

select encode(CAST(md5('111') AS bytea), 'base64');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...