/ / Converti hex in utf8 in greenplum in regexp_replace - regex, postgresql, hex, greenplum

Converti hex in utf8 in greenplum in regexp_replace - regex, postgresql, hex, greenplum

Ho delle stringhe in una tabella che contengono valori esadecimali come ffffffc4. Un esempio è il seguente:

Urzffffffc4ffffff85dzenie zgodne ze standardem High Definition Audio

Il seguente codice può convertire l'esadecimale in UTF8:

select chr(x"c4"::int)

che ritorna Ä ma quando provo a usare un regexp_replace, ho problemi. Ho provato il seguente:

select regexp_replace(sal_input, E"\f{6}(..)",convert(E"\1","xyz","UTF8"),"g")

dove XYZ sono le varie codifiche sorgente offerte in 8.2 ma tutto ciò che ottengo è il valore esadecimale.

Qualche idea su come potrei usare la funzione chr dentro regexp_replace?

Versione utilizzata: PostgreSQL 8.2.15 (Greenplum Database 4.1.1.1 build 1) su x86_64-unknown-linux-gnu

Grazie in anticipo per l'aiuto

risposte:

1 per risposta № 1

Stai fraintendendo l'ordine di valutazione. Il secondo argomento a regexp_replace non è una richiamata invocata per ogni sostituzione di "1".

Quello che succede è il tuo convert la chiamata è valutata primo, sul valore letterale 1e questo risultato è passato a regexp_replace.

In ogni caso, SQL non valuta nemmeno su un PostgreSQL moderno a causa di regole di casting più severe, come "1" non è un valido bytea letterale.

In una versione Pg meno antica potrebbe essere possibile fare qualcosa con regexp_split_to_table, chr e string_agg. In 8.2, penso che userete un PL PL/Perl e scrivere una semplice funzione Perl per farlo. È probabile che si possa implementare in PL / PgSQL, ma sospetto che qualsiasi implementazione con la funzionalità disponibile in 8.2 sarà prolissa e lenta. Mi piacerebbe essere smentito.