データを扱う際に、「①、②、③…」のような丸付き数字を使いたい場面があるかもしれません。例えば、ランキングの表示やUIの視認性向上などに活用できます。しかし、データベースでは通常の数値(1,2,3…)として管理されることが多く、丸付き数字と数値を相互に変換する方法を知っておくと便利です。
本記事では、PostgreSQLを使って丸付き数字を数値に変換する方法と数値を丸付き数字に変換する方法を紹介します。SQLの組み込み関数を活用した簡単な変換方法から、汎用的に使える関数の作成まで、実用的なコードと共に解説していきます。
丸付き数字を数値に変換する方法
PostgreSQLでは、「①, ②, ③…」のような丸付き数字は文字列(TEXT型)として扱われます。そのため、これを通常の数値(1, 2, 3…)に変換するには、丸付き数字のUnicodeコードポイントを利用するのが効果的です。
丸付き数字のUnicode
丸付き数字は、以下のようなUnicodeが割り当てられています。
丸付き数字 | 数値 | Unicode | ASCIIコード |
---|---|---|---|
① | 1 | U+2460 | 9312 |
② | 2 | U+2461 | 9313 |
③ | 3 | U+2462 | 9314 |
… | … | … | … |
この表から分かるように、「①」(U+2460) は 9312 というASCIIコードを持っています。
この規則を利用すれば、丸付き数字のASCIIコードから 9311 を引く ことで対応する数値を求めることができます。
SQLを使った変換方法
方法1:ascii() 関数を利用する方法
PostgreSQLには ascii()
関数があり、文字のASCIIコードを取得できます。
これを利用して、丸付き数字を数値に変換するSQLを書いてみます。
SELECT ascii('①') - 9311; -- 結果: 1
SELECT ascii('②') - 9311; -- 結果: 2
SELECT ascii('③') - 9311; -- 結果: 3
この方法は単体の文字を変換する場合に有効ですが、テーブルのデータを変換したい場合は、関数化すると便利です。
方法2:汎用的な変換関数を作成する
複数のデータを一括変換したい場合は、PL/pgSQLで関数を作成しましょう。
CREATE FUNCTION circle_num_to_int(circle_num TEXT) RETURNS INT AS $$
BEGIN
RETURN ascii(circle_num) - 9311;
END;
$$ LANGUAGE plpgsql;
この関数を使えば、丸付き数字を数値に簡単に変換できます。
SELECT circle_num_to_int('①'); -- 結果: 1
SELECT circle_num_to_int('⑩'); -- 結果: 10
方法3:CASE WHEN を使う方法
もし ascii()
を使いたくない場合は、CASE WHEN
を利用して手動でマッピングすることもできます。
SELECT CASE
WHEN '①' = '①' THEN 1
WHEN '②' = '②' THEN 2
WHEN '③' = '③' THEN 3
ELSE NULL
END;
これは簡易的な方法ですが、範囲が広がると手間が増えるため、ascii()
を使う方法が推奨されます。
実際のデータ変換
例えば、rankings
というテーブルがあり、そこに circle_rank
という丸付き数字のカラムがあるとします。
id | circle_rank |
---|---|
1 | ① |
2 | ② |
3 | ③ |
4 | ④ |
5 | ⑤ |
このカラムを数値に変換するクエリは以下のようになります。
SELECT id, circle_rank, circle_num_to_int(circle_rank) AS rank_number
FROM rankings;
こうすることで、テーブル内の丸付き数字をすべて数値に変換できます。
id | circle_rank | rank_number |
---|---|---|
1 | ① | 1 |
2 | ② | 2 |
3 | ③ | 3 |
4 | ④ | 4 |
5 | ⑤ | 5 |
数値を丸付き数字に変換する方法
前章では、丸付き数字を数値に変換する方法を解説しました。
今度は逆に、通常の数値(1, 2, 3…)を丸付き数字(①, ②, ③…)に変換する方法を見ていきましょう。
丸付き数字のUnicodeを活用する
丸付き数字のUnicodeコードポイントは U+2460(①) から順番に割り当てられています。
これは、数値の n
に対して、n + 9311
で求めることができます。
数値 | 丸付き数字 | Unicode | ASCIIコード |
---|---|---|---|
1 | ① | U+2460 | 9312 |
2 | ② | U+2461 | 9313 |
3 | ③ | U+2462 | 9314 |
… | … | … | … |
この法則を利用して、PostgreSQLで数値を丸付き数字に変換するSQLを作成します。
chr() 関数を利用した変換
PostgreSQLの chr()
関数は、指定した数値(ASCIIコード)に対応する文字を返します。
これを利用すれば、数値を丸付き数字に変換できます。
SELECT chr(1 + 9311); -- 結果: '①'
SELECT chr(2 + 9311); -- 結果: '②'
SELECT chr(3 + 9311); -- 結果: '③'
これはシンプルな方法ですが、SQLクエリ内で頻繁に使用する場合は、関数化すると便利です。
汎用的な変換関数の作成
PL/pgSQL を使って、数値を丸付き数字に変換する関数を作成しましょう。
CREATE FUNCTION int_to_circle_num(n INT) RETURNS TEXT AS $$
BEGIN
RETURN chr(n + 9311);
END;
$$ LANGUAGE plpgsql;
この関数を使えば、簡単に数値を丸付き数字に変換できます。
SELECT int_to_circle_num(1); -- 結果: '①'
SELECT int_to_circle_num(10); -- 結果: '⑩'
SELECT int_to_circle_num(20); -- 結果: '⑳'
CASE WHEN を使った方法
もし chr()
を使いたくない場合は、CASE WHEN
を利用して手動でマッピングすることもできます。
SELECT CASE
WHEN 1 = 1 THEN '①'
WHEN 2 = 2 THEN '②'
WHEN 3 = 3 THEN '③'
ELSE NULL
END;
実際のデータ変換
rankings
というテーブルがあり、rank_number
という数値のカラムがあるとします。
このカラムを丸付き数字に変換して取得するには、以下のようなクエリを実行します。
SELECT id, rank_number, int_to_circle_num(rank_number) AS circle_rank
FROM rankings;
まとめ
本記事では、PostgreSQLを使って丸付き数字と数値を相互変換する方法を紹介しました。
具体的には、以下の2つの変換について解説しました。
✅ 丸付き数字 → 数値に変換する方法
ascii()
関数を使い、9311を引くことで数値を取得PL/pgSQL
で汎用的な関数circle_num_to_int()
を作成CASE WHEN
でも対応可能だが、範囲が広がると非効率
✅ 数値 → 丸付き数字に変換する方法
chr()
関数を使い、9311を足すことで丸付き数字を取得PL/pgSQL
で汎用的な関数int_to_circle_num()
を作成CASE WHEN
でも対応可能だが、汎用性が低い
また、実際のテーブルデータを使った変換クエリの例も紹介しました。
これにより、データベースのランキングやリストの表示をより視覚的に分かりやすくすることができます。
最後までお読みいただきありがとうございました!
コメント