输入实际上是字符串时,“整数的无效输入语法”

时间:2018-09-04 13:41:23

标签: sql postgresql

我正在尝试从Basic Auth字符串中提取电子邮件,如下所示:

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

预期结果为test@test.com,但是我收到错误消息:

[22P02] ERROR: invalid input syntax for integer: "^.*(?=:)"

这是什么问题? Postgres是否出于某种原因认为substring第二个参数必须为整数?

编辑:只是简化了此查询,以演示解码是否有效:

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

结果:test@test.com: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:拼写。

2 个答案:

答案 0 :(得分:1)

您需要convert_from才能将decode的输出更改为utf-8或任何其他编码格式。

decode的输出是整数集,而不是test..,因此是错误。

http://rextester.com/NTMHG12543

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

答案 1 :(得分:0)

问题在于解码结果不是文本。它是一个bytea,然后子字符串需要一个整数,而不是正则表达式。只需将解码结果的类型更改为文本,即可正常运行(我希望如此)

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