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 № 1Stai 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 1
e 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.