-1

テーブルに、などの16進値を含む文字列があります\ffffffc4。例は次のとおりです。

Urz\ffffffc4\ffffff85dzenie zgodne ze standardem High Definition Audio

次のコードは、16進数を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で提供されているさまざまなソースエンコーディングですが、返されるのは16進値だけです。

内部でchr関数をどのように使用できるかについてのアイデアはありregexp_replaceますか?

使用したバージョン:x86_64上のPostgreSQL 8.2.15(Greenplum Database 4.1.1.1ビルド1)-unknown-linux-gnu

助けてくれてありがとう

4

1 に答える 1

1

評価の順序を誤解しています。の 2 番目の引数regexp_replaceは、'\1' の置換ごとに呼び出されるコールバックではありません。

何が起こるかというと、convert呼び出しが最初にリテラル値\1で評価され、その結果が に渡されregexp_replaceます。

いずれにせよ、'\1'有効なbyteaリテラルではないため、キャスト規則がより厳密であるため、SQL は最新の PostgreSQL でさえ評価されません。

regexp_split_to_tableより古いバージョンの Pgでは、 、chrおよびを使用して何かを実行できる可能性がありstring_aggます。8.2 では、PL を使用することになると思います。PL/Perlそれを行うには、単純な Perl 関数を読み込んで記述します。PL/PgSQL で実装することはおそらく可能ですが、8.2 で利用可能な機能を実装すると冗長で遅くなると思います。私が間違っていると証明されたいです。

于 2012-09-20T00:15:22.033 に答える