Mam ciągi w tabeli, które zawierają wartości szesnastkowe takie jak ffffffc4
. Przykład jest następujący:
Urzffffffc4ffffff85dzenie zgodne ze standardem High Definition Audio
Poniższy kod może przekonwertować hex na UTF8:
select chr(x"c4"::int)
który wraca Ä
ale kiedy próbuję użyć regexp_replace, mam problemy. Próbowałem następujące:
select regexp_replace(sal_input, E"\f{6}(..)",convert(E"\1","xyz","UTF8"),"g")
gdzie XYZ to różne kodowania źródłowe oferowane w 8.2, ale wszystko, co otrzymuję, to wartość szesnastkowa.
Każdy pomysł, w jaki sposób mogę użyć funkcji chr wewnątrz regexp_replace
?
Użyta wersja: PostgreSQL 8.2.15 (baza danych Greenplum 4.1.1.1 build 1) na x86_64-unknown-linux-gnu
Z góry dziękuję za pomoc
Odpowiedzi:
1 dla odpowiedzi № 1Nie rozumiesz kolejności oceny. Drugi argument do regexp_replace
nie jest wywołaniem zwrotnym wywoływanym dla każdego podstawienia „1”.
Co się dzieje, to twoje convert
połączenie jest oceniane pierwszy, na wartości dosłownej 1
, a ten wynik jest przekazywany do regexp_replace
.
W każdym razie SQL nie ocenia nawet nowoczesnego PostgreSQL z powodu bardziej rygorystycznych reguł rzutowania, ponieważ "1"
nie jest ważny bytea
dosłowny.
W mniej starszej wersji Pg można coś zrobić regexp_split_to_table
, chr
i string_agg
. W 8.2 myślę, że użyjesz PL. Załaduję PL/Perl
i napisz prostą funkcję Perla, aby to zrobić. Prawdopodobnie możliwe jest wdrożenie w PL / PgSQL, ale podejrzewam, że jakakolwiek implementacja z funkcjonalnością dostępną w 8.2 będzie pełna i powolna. Chciałbym, aby udowodniono, że się mylę.