2021年7月9日金曜日

全国地方公共団体コードのチェックサムを計算する

 全国地方公共団体コードは6桁として定義されていますが、最後の1桁はチェックディジットです。オープンデータには市区町村のコードとして、チェックディジットを除いた5桁のコードを含んでいる場合があります。

たまに5桁のコードよりチェックディジットを計算して付与し、6桁にしたいときがあります。ちょっと取り組んでみたので、その作業ログです。

検算に使用したデータは総務省の全国地方公共団体コードのページより入手しました。


全国地方公共団体コードのチェックディジットの仕様は上記のPDFの記載(11 検査数字)が原本にあたると思いますが、わかりにくかったのでWikipediaの記載を参考にコードを記述しました。

検算に使用するExcelファイルは000730858.xlsxとしてダウンロードされました。これをSQLワークショップデータ・ワークショップよりロードします。

SQLワークショップユーティリティに含まれる、データ・ワークショップを実行します。ページが開いたら、データのロードを実行します。


ロードするファイルとして000730858.xlsxを選択します。


新規に表を作成します。表名MUNICIPALITY_CODESとします。データのロードを実行します。


データのロードが完了します。


ほぼデフォルトのままなので、列名が日本語のままになっています。

チェックサムの計算と検算には以下のSQLを使用しました。

with
function append_checkdigit(p_code in varchar2)
return varchar2
is
begin
return p_code
||
substr(
to_char(
(11 -
mod(
(6*to_number(substr(p_code,1,1)))
+ (5*to_number(substr(p_code,2,1)))
+ (4*to_number(substr(p_code,3,1)))
+ (3*to_number(substr(p_code,4,1)))
+ (2*to_number(substr(p_code,5,1)))
, 11)
),
'FM00'),
-1, 1)
;
end;
select mcode6, mcode5, append_checkdigit(mcode5) cmcode6 from
(
select mcode6, substr(mcode6, 1,5) mcode5 from
(
select to_char("団体コード", 'FM000000') mcode6
from municipality_codes order by "団体コード"
)
)
where mcode6 <> append_checkdigit(mcode5)

元々の6桁のコード(mcode6)から末尾の1桁を除いて(mcode5) います。それに対してチェックディジットを計算し、再度、末尾に1桁追加します(cmcode6)。チェックディジットの計算と追加はファンクションappend_checkdigitが行なっています。

すべての行で計算前(mcode6)と計算後(append_checkdigit(mcode5))に違いはなかったので、ファンクションに間違いはなさそうです。