Eu tenho seqüências de caracteres em uma tabela que contêm valores hexadecimais como ffffffc4
. Um exemplo é o seguinte:
Urzffffffc4ffffff85dzenie zgodne ze standardem High Definition Audio
O código a seguir pode converter o hex em UTF8:
select chr(x"c4"::int)
que retorna Ä
mas quando eu tento usar um regexp_replace eu entro em problemas. Eu tentei o seguinte:
select regexp_replace(sal_input, E"\f{6}(..)",convert(E"\1","xyz","UTF8"),"g")
Onde XYZ são as várias codificações de fonte oferecidas em 8.2, mas tudo que eu recebo é o valor hexadecimal.
Qualquer ideia de como eu poderia usar a função chr dentro regexp_replace
?
Versão utilizada: PostgreSQL 8.2.15 (Greenplum Database 4.1.1.1 build 1) no x86_64-unknown-linux-gnu
Obrigado antecipadamente pela ajuda
Respostas:
1 para resposta № 1Você está entendendo mal a ordem da avaliação. O segundo argumento para regexp_replace
Não é chamado um retorno de chamada para cada substituição de "1".
O que acontece é que o seu convert
chamada é avaliada primeiro, no valor literal 1
, e esse resultado é passado para regexp_replace
.
Em qualquer caso, o SQL nem sequer avalia em um PostgreSQL moderno por causa de regras de transmissão mais estritas, como "1"
não é um válido bytea
literal.
Em uma versão de Pg menos antiga, seria possível fazer algo com regexp_split_to_table
, chr
e string_agg
. Em 8.2, eu acho que você vai estar usando um PL. PL/Perl
e escreva uma função Perl simples para fazer isso. É provável que seja possível implementar em PL / PgSQL, mas suspeito que qualquer implementação com a funcionalidade disponível em 8.2 será detalhada e lenta. Eu adoraria estar errado.