Я пытаюсь извлечь электронное письмо из строки Basic Auth следующим образом:
SELECT substring(decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'), 'base64'), '^.*(?=:)');
Ожидаемый результат - [email protected], но вместо этого я получаю сообщение об ошибке:
[22P02] ERROR: invalid input syntax for integer: "^.*(?=:)"
В чем проблема? Считает ли postgres, что второй аргумент substring по какой-то причине должен быть целым числом?
Обновлено: немного упростил этот запрос, чтобы продемонстрировать, что декодирование работает:
SELECT decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'), 'base64');
результат: [email protected]:password
EDIT2: людям, указывающим на отсутствие from - согласно документам postgres он вам не нужен, и в этом случае он взаимозаменяем с запятой - https://www.postgresql.org/docs/10/static/functions-matching.html
Пример с этой страницы:
SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Result: 123
EDIT3: Орфография.
Ага. w3resource.com/PostgreSQL/substring-function.php
Ха-ха .... Кабальеро .... лошадь без имени. Идеальный.
@jarlh должен давать ожидаемый результат, а не выдавать ошибку.
@ rory.ap, согласно документации postgres, функция substring() также принимает в качестве аргумента регулярное выражение.
Я не понимаю того, что вы получаете по этой ссылке в EDIT2. Это слово comma, а не coma, и ни в одном случае это слово вообще не появляется на связанной странице.
@Damien_The_Unbeliever Спасибо, что указали на опечатку, проблема решена - ответ принят.


Проблема в том, что результатом декодирования является не текст. Это байт, а затем подстрока ожидает целое число, а не регулярное выражение. Просто измените тип результата декодирования на текст, и все работает отлично (я надеюсь на это)
SELECT substring((decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'), 'base64'))::text ,'^.*(?=:)');
Я подозревал это и попробовал кастинг, прежде чем опубликовать этот вопрос, это не сработало.
Какая у вас версия postgres? Я проверил на 9.6, и он отлично работает после типов приведения. Возвращает [email protected]
Я использую версию 10. Пробовал ваш пример, а также функцию CAST(), не сработало.
convert_from необходим для изменения вывода decode на utf-8 или любой другой формат кодирования.
На выходе декодирования задано целое число, а не test.., отсюда и ошибка.
http://rextester.com/NTMHG12543
SELECT substring(convert_from(decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'
), 'base64'
), 'utf-8'
), '^.*(?=:)'
);
Что еще должно быть ???