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対応する場合などは
注意が必要である
備忘までに