0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Postgresqlで文字変換をかけたい

0
Posted at

Oracleでは全角、半角に変換する際に
TO_MULTI_BYTE
TO_SINGLE_BYTE
の関数を使用することができるが、

Postgresqlではこのような関数が存在しないため
もし脱Oracleに際してそのような動きが必要になった場合
関数を作る必要がある

基本的にはtranslate()を使用して
一文字ずつ変換していくのが手法になる

CREATE OR REPLACE FUNCTION conv_half_to_full(beforetext TEXT)
RETURNS TEXT 
AS $$
DECLARE
  result text := beforetext;
BEGIN
  result := translate(result,
                      '0123456789',
                      '0123456789'
                      );
  result := translate(result,
                      'abcdefghijklmnopqrstuvwxyz',
                      'abcdefghijklmnopqrstuvwxyz'
                      );
  result := translate(result,
                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                      ); 
  return result;
END;
$$ LANGUAGE postgresql;

上記のような関数を用紙してあげることで

--実行
SELECT conv_half_to_full('Hello World123');

--実行結果
Hello World123

というように変換をすることができる
translate関数は中身を一文字ずつ変換するため
このような書き方でも変換ができる

今回は半角→全角としたが
反対に全角を半角にしたい場合は
translate関数の第二引数と第三引数を
変えてあげるだけで関数を作成することができる

カタカナへの対応は別途関数が必要であり
またパとパでは半濁音が分かれていることからもわかるように
濁点、半濁点の為に別途関数を用紙する必要が出てくる

濁点半濁点を先に変換してからreplaceをしていく方法であれば

CREATE OR REPLACE FUNCTION htof_kana(src TEXT)
RETURNS TEXT AS $$
DECLARE
    result TEXT := src;
    i INT;

    -- 2文字(濁点・半濁点)対応
    half2full_daku CONSTANT TEXT[][] := ARRAY[
        ['ガ','ガ'], ['ギ','ギ'], ['グ','グ'], ['ゲ','ゲ'], ['ゴ','ゴ'],
        ['ザ','ザ'], ['ジ','ジ'], ['ズ','ズ'], ['ゼ','ゼ'], ['ゾ','ゾ'],
        ['ダ','ダ'], ['ヂ','ヂ'], ['ヅ','ヅ'], ['デ','デ'], ['ド','ド'],
        ['バ','バ'], ['ビ','ビ'], ['ブ','ブ'], ['ベ','ベ'], ['ボ','ボ'],
        ['パ','パ'], ['ピ','ピ'], ['プ','プ'], ['ペ','ペ'], ['ポ','ポ'],
        ['ヴ','ヴ']
    ];

    -- 1文字の半角カナ対応
    half2full CONSTANT TEXT[][] := ARRAY[
        ['ア','ア'], ['イ','イ'], ['ウ','ウ'], ['エ','エ'], ['オ','オ'],
        ['カ','カ'], ['キ','キ'], ['ク','ク'], ['ケ','ケ'], ['コ','コ'],
        ['サ','サ'], ['シ','シ'], ['ス','ス'], ['セ','セ'], ['ソ','ソ'],
        ['タ','タ'], ['チ','チ'], ['ツ','ツ'], ['テ','テ'], ['ト','ト'],
        ['ナ','ナ'], ['ニ','ニ'], ['ヌ','ヌ'], ['ネ','ネ'], ['ノ','ノ'],
        ['ハ','ハ'], ['ヒ','ヒ'], ['フ','フ'], ['ヘ','ヘ'], ['ホ','ホ'],
        ['マ','マ'], ['ミ','ミ'], ['ム','ム'], ['メ','メ'], ['モ','モ'],
        ['ヤ','ヤ'], ['ユ','ユ'], ['ヨ','ヨ'],
        ['ラ','ラ'], ['リ','リ'], ['ル','ル'], ['レ','レ'], ['ロ','ロ'],
        ['ワ','ワ'], ['ヲ','ヲ'], ['ン','ン'],
        ['ァ','ァ'], ['ィ','ィ'], ['ゥ','ゥ'], ['ェ','ェ'], ['ォ','ォ'],
        ['ャ','ャ'], ['ュ','ュ'], ['ョ','ョ'], ['ッ','ッ'],
        ['ー','ー'], ['・','・'], ['。','。'], ['、','、'], ['「','「'], ['」','」']
    ];
BEGIN
    -- 2文字(濁点・半濁点)を先に変換
    FOREACH i IN ARRAY generate_subscripts(half2full_daku, 1) LOOP
        result := replace(result, half2full_daku[i][1], half2full_daku[i][2]);
    END LOOP;

    -- 1文字の半角カナを変換
    FOREACH i IN ARRAY generate_subscripts(half2full, 1) LOOP
        result := replace(result, half2full[i][1], half2full[i][2]);
    END LOOP;

    RETURN result;
END;
$$ LANGUAGE plpgsql;

といった具合でしょうか
translateでやる場合がぱっと思いつかなかったので
replaceで強引に変換する形にしています

postgresqlで文字変換を行う場合は
このような手間が必要になるため

各種OracleのsqlをPostgresql対応する場合などは
注意が必要である

備忘までに

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?