"недопустимый синтаксис ввода для целого числа", когда ввод фактически является строкой

Я пытаюсь извлечь электронное письмо из строки 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: Орфография.

Что еще должно быть ???

jarlh 04.09.2018 15:43

Ага. w3resource.com/PostgreSQL/substring-function.php

rory.ap 04.09.2018 15:43

Ха-ха .... Кабальеро .... лошадь без имени. Идеальный.

rory.ap 04.09.2018 15:48

@jarlh должен давать ожидаемый результат, а не выдавать ошибку.

Caballero 04.09.2018 15:57

@ rory.ap, согласно документации postgres, функция substring() также принимает в качестве аргумента регулярное выражение.

Caballero 04.09.2018 16:00

Я не понимаю того, что вы получаете по этой ссылке в EDIT2. Это слово comma, а не coma, и ни в одном случае это слово вообще не появляется на связанной странице.

Damien_The_Unbeliever 04.09.2018 16:08

@Damien_The_Unbeliever Спасибо, что указали на опечатку, проблема решена - ответ принят.

Caballero 04.09.2018 16:11
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
1 275
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что результатом декодирования является не текст. Это байт, а затем подстрока ожидает целое число, а не регулярное выражение. Просто измените тип результата декодирования на текст, и все работает отлично (я надеюсь на это)

SELECT substring((decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'), 'base64'))::text ,'^.*(?=:)');

Я подозревал это и попробовал кастинг, прежде чем опубликовать этот вопрос, это не сработало.

Caballero 04.09.2018 16:04

Какая у вас версия postgres? Я проверил на 9.6, и он отлично работает после типов приведения. Возвращает [email protected]

Grzegorz Grabek 04.09.2018 16:06

Я использую версию 10. Пробовал ваш пример, а также функцию CAST(), не сработало.

Caballero 04.09.2018 16:07
Ответ принят как подходящий

convert_from необходим для изменения вывода decode на utf-8 или любой другой формат кодирования.

На выходе декодирования задано целое число, а не test.., отсюда и ошибка.

http://rextester.com/NTMHG12543

SELECT substring(convert_from(decode(substring('"authorization":["Basic dGVzdEB0ZXN0LmNvbTpwYXNzd29yZA= = "]', '(?< = "Basic ).*?(? = "])'
                                              ), 'base64'
                                    ), 'utf-8'
                             ), '^.*(?=:)'
                );

Другие вопросы по теме