我正在尝试从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:拼写。
答案 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 ,'^.*(?=:)');