-1

我的表中有包含十六进制值的字符串,例如\ffffffc4. 一个例子如下:

Urz\ffffffc4\ffffff85dzenie zgodne ze standardem High Definition Audio

以下代码可以将十六进制转换为 UTF8:

select chr(x'c4'::int) 

它返回Ä,但是当我尝试使用 regexp_replace 时,我遇到了问题。我尝试了以下方法:

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

其中 XYZ 是 8.2 中提供的各种源编码,但我得到的只是十六进制值。

关于如何在里面使用 chr 函数的任何想法regexp_replace

使用的版本:x86_64-unknown-linux-gnu 上的 PostgreSQL 8.2.15 (Greenplum Database 4.1.1.1 build 1)

在此先感谢您的帮助

4

1 回答 1

1

您误解了评估的顺序。的第二个参数regexp_replace不是每次替换 '\1' 时调用的回调。

发生的情况是您的convert调用首先在字面值上进行评估\1,然后将该结果传递给regexp_replace.

无论如何,由于更严格的转换规则,SQL 甚至不会在现代 PostgreSQL 上进行评估,因为'\1'它不是有效的bytea文字。

在不太古老的 Pg 版本中,可能可以使用regexp_split_to_table,chrstring_agg. 在 8.2 中,我认为您将使用 PL。我会加载PL/Perl并编写一个简单的 Perl 函数来完成它。很可能在 PL/PgSQL 中实现,但我怀疑任何具有 8.2 中可用功能的实现都会冗长且缓慢。我很想被证明是错的。

于 2012-09-20T00:15:22.033 回答