保険者番号は8桁で何を語るか ── 法別番号・都道府県番号・検証番号をレセコンの実装から読む

· 更新日: · · 医療IT, ORCA, 保険者番号, レセコン, レセプト, 医療事務

更新履歴(4件・最終更新 2026年08月02日)

この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。

記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
`IsValidInsurerNumber`が、末尾以外の桁に数字以外が混ざった入力に対して`false`ではなく`ArgumentException`を投げていました。検査していたのが末尾1桁だけで、残りはそのまま`CheckDigit`へ渡していたためです。OCRやバーコード、手入力を通す以上ここは`bool`で返し切るべきなので、全桁を先に検査するようにしました。
冒頭に対象読者と用語の表を追加し、レセプト請求の実務知識が無くても読めるようにしました。チェックディジットの計算をC#でも示し(4桁の旧政管を対象外にする判定を含みます)、Luhnアルゴリズムとの関係を「9を引く」と「2桁を分けて足す」が同値である理由まで説明しました。手計算の例は表組みに直しています。
初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.21590186)

以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。

小村 豪(2026)「保険者番号は8桁で何を語るか ── 法別番号・都道府県番号・検証番号をレセコンの実装から読む」合同会社小村ソフト. https://comcomponent.com/blog/insurer-number-structure/

DOI(登録済みアーカイブ)
10.5281/zenodo.21590186
DOI(前回登録した版)
10.5281/zenodo.21733124

保険者番号は、ただの連番ではありません。たとえば8桁の06130488は、制度・保険者の所在地・保険者ごとの番号・検算用の1桁に分けて読めます。一方、6桁の国保や、過去データに残る4桁の旧政管健保まで同じ位置で分解すると、読み違えます。

この記事の要点は3つです。

  • まず桁数を見てから、番号を分解する。 原則は8桁、国民健康保険(退職者医療を除く)は6桁です。旧・政府管掌健康保険の4桁には、専用の都道府県番号表を使う歴史的な特例があります。
  • 検証番号は入力ミスの検出に使う。 末尾以外の桁を右端から検算します。ただし、計算が合うことと、保険者の実在・個人の資格・負担割合が確認できることは別です。
  • 実装は文字列とマスタを基本にする。 先頭ゼロを守り、番号体系からの推定とマスタによる確認を分けます。ORCAのソースには、この原則と制度の歴史が具体的な分岐として残っています。

ORCAシリーズの4本目は、予告していたレセプト点検の話の前に、保険者番号を番外編として取り上げます。番号の構成、チェックデジットの手計算とCOBOL実装、旧政管の4桁特例、その痕跡が残るコードを順に見ていきます。

制度側の一次資料は、厚生労働省の「保険者番号、公費負担者番号、公費負担医療の受給者番号並びに医療機関コード及び薬局コード設定要領」(以下「設定要領」)です。現在の番号体系と旧政管の特例は、資料の時点を分けて読みます。 実装側は前回までと同じく、公式公開された日レセ本体 5.2系ソース(2026年7月公開スナップショット) を読んだ結果に基づきます。別の版や個別環境の動作まで一律に保証するものではありません。

対象読者と、この記事で使う4つの用語

対象は、医療機関向けのシステム(レセコン・電子カルテ・受付や請求まわりの業務アプリ)を作る・つなぐエンジニアと、医療データの取り込みを担当する情報システム担当者です。レセプト請求の実務知識や、シリーズ前3本の通読は前提にしていません。 次の4語を押さえれば、この記事だけでも読めます。

用語 意味
レセプト 診療報酬明細書。医療機関が1か月分の診療内容をまとめ、審査支払機関(社会保険診療報酬支払基金・国民健康保険団体連合会)を経由して保険者へ費用を請求するための明細
レセコン レセプトコンピューター。レセプトの作成・請求を担う業務システム。診療記録を書く電子カルテとは別のソフトウェア
日レセ 日本医師会が提供する「日医標準レセプトソフト」の略称。ORCAプロジェクトの中核をなすレセコンで、本記事で読むソースコードはこれ
保険者 公的医療保険を運営する主体。協会けんぽ、健康保険組合、市町村(国民健康保険)、後期高齢者医療広域連合など。本記事の主役である保険者番号が識別するのはこの単位

レセコンと電子カルテの関係、ORCAの全体像そのものはシリーズ1本目で扱っています。

目的に合わせた読み方

知りたいこと 読む章
6桁・8桁の違いと、各桁の意味を知りたい 第1〜3章
入力チェックを実装し、計算の落とし穴を確認したい 第4章、第8章
旧データの4桁番号や「政管」という表示を調べたい 第5章
番号で判断してはいけないことを確認したい 第6章
ORCAのマスタと検証処理の関係を読みたい 第7章

目次

  1. まず結論 ── 保険者番号は「制度+地域+連番+検算」でできている
  2. 法別番号 ── 先頭2桁で制度が分かる
  3. 都道府県番号と保険者別番号 ── どこの保険者かまで分かる
  4. 検証番号 ── モジュラス10ウェイト2-1を手計算する
  5. 例外の話 ── 旧政管健保の保険者番号は「4桁」だった
  6. 保険者番号から「分からないこと」
  7. ORCAはどう実装しているか ── 2つのマスタと桁数の分岐
  8. 番号を扱うシステムを作る側の実務ポイント
  9. まとめ
  10. 参考資料

図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全18件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle

1. まず結論 ── 保険者番号は「制度+地域+連番+検算」でできている

8桁の基本形を、4つの部品に分ける

設定要領の第1にある基本形は、次の8桁です。この表の桁位置は8桁番号のもので、6桁番号にはそのまま当てはめません。

位置 桁数 名前 意味
1〜2桁目 2 法別番号 医療保険制度の区分(協会けんぽ、組合健保、後期高齢者医療…)
3〜4桁目 2 都道府県番号 保険者の所在地の都道府県
5〜7桁目 3 保険者別番号 制度・都道府県の中での保険者ごとの番号
8桁目 1 検証番号 チェックデジット(モジュラス10ウェイト2-1)

国民健康保険(退職者医療を除く)は、本則で別の構成が定められています。法別番号を持たず、都道府県番号2桁+保険者別番号3桁+検証番号1桁の計6桁です。正しい保険者番号として6桁なら、市町村国保か国保組合の番号と読めます。

まず、読み始める位置の違いを押さえてください。

番号の種類 桁数 先頭からの構成
原則の形 8桁 法別2桁+都道府県2桁+保険者別3桁+検証1桁
国民健康保険(退職者医療を除く) 6桁 都道府県2桁+保険者別3桁+検証1桁
旧・政府管掌健康保険の特例 4桁 専用表の都道府県2桁+保険者別2桁。法別番号・検証番号は含まない(第5章)

06130488を実際に読む

設定要領に載っている例を、そのまま分解してみます。

06  13  048  8
│   │   │    └ 検証番号(第4章で検算します)
│   │   └ 保険者別番号: 東京の組合の中での048番
│   └ 都道府県番号: 13 = 東京
└ 法別番号: 06 = 組合管掌健康保険

番号だけで読めるのは「東京都にある組合健保の048番」という単位までです。組合の正式名称はマスタで調べる必要があります。 この境界を意識しながら、各部品を見ていきます。

2. 法別番号 ── 先頭2桁で制度が分かる

法別番号があるのは8桁の形

法別番号は、設定要領の別表1(1)「法別番号及び制度の略称表」などに定められています。以下は過去データを読むための区分も含む主な番号です。6桁の国保の先頭2桁は法別番号ではなく、都道府県番号なので、先に桁数を区別します。

法別番号 制度 略称
01 協会けんぽ(全国健康保険協会管掌健康保険。旧・政府管掌健康保険) (協)
02 船員保険 (船)
03 / 04 日雇特例被保険者の保険(一般療養 / 特別療養費) (日)
06 組合管掌健康保険 (組)
07 自衛官等の療養の給付 (自)
31〜34 共済組合(国家公務員 / 地方公務員等 / 警察 / 公立学校・私学振興) (共)
39 後期高齢者医療 (高)
63, 72〜75 特例退職(特定健保組合 / 各特定共済組合) (退)
67 国民健康保険法による退職者医療 ─
(なし・6桁) 国民健康保険(退職者医療を除く) ─

「社保・国保」と「6桁・8桁」を同一視しない

レセプトの提出先は、制度によって分かれます。被用者保険などの社保側(上表の01〜34にある区分、63、72〜75)は社会保険診療報酬支払基金へ、国民健康保険(6桁と法別67)と後期高齢者医療(39)は国民健康保険団体連合会へ提出する、という整理です。番号の桁数と法別番号は、この区分を判定する手がかりになります。

ただし、「6桁=国保、8桁=社保」ではありません。 国保の退職者医療(67)は法別番号付きの8桁で、後期高齢者医療(39)も8桁です。実装では、上表の区分を単なる数値の範囲判定にせず、第8章で述べる制度マスタに対応を持たせます。

同じ保険者が複数の番号を持つこともある

別表1の注記にある63・72〜75は、特例退職被保険者などに係る法別番号です。同じ健康保険組合でも、一般の被保険者向けに06、特例退職被保険者向けに63と、複数の保険者番号を持つことがあります。1つの保険者に番号が1つだけ、とは限りません。

また、生活保護の12や精神通院医療の21などは、よく似た8桁でも公費負担者番号という別体系です。構成は「法別2桁+都道府県2桁+実施機関3桁+検証1桁」ですが、医療保険の保険者番号とはレセプトの記載欄も異なります。第6章で改めて区別します。

3. 都道府県番号と保険者別番号 ── どこの保険者かまで分かる

都道府県番号は、患者の住所ではない

通常の都道府県番号は、設定要領の別表2にある01(北海道)〜47(沖縄)です。並びは一般に使われる都道府県コード(JIS)と同じで、東京は13、大阪は27。8桁番号では3〜4桁目、6桁番号では1〜2桁目に置かれます。

基準は保険者の所在地です。全国転勤のある会社でも、健保組合の所在地が東京なら13になります。患者の居住地や勤務先の所在地を、この2桁から決めることはできません。

保険者別番号は、制度と地域を組み合わせて読む

保険者別番号は、制度・都道府県の中で保険者ごとに振られる3桁です。設定者も通知に定められています。

制度 番号を付ける単位 設定者
協会けんぽ 都道府県支部 厚生労働省保険局
組合健保 健康保険組合 地方厚生(支)局
国民健康保険 市町村・国保組合 都道府県
後期高齢者医療 後期高齢者医療の保険者 後期高齢者医療広域連合
共済組合 各共済組合 各主管官庁

昭和51年の制定当初は社会保険庁長官や都道府県知事が設定者でしたが、行政組織の再編とともに現在の機関へ引き継がれています。現行の設定者は、厚生労働省の通知・別添第1の4で確認できます。

保険者番号は、全国で1本の連番を振るのではなく、制度・地域ごとの枠で採番するコードです。保険者別番号だけを取り出しても足りず、法別番号・都道府県番号と組み合わせて初めて、どの単位の番号かを指せます。第7章のORCAが保険者番号そのものを検索キーにすることとも整合します。

協会けんぽは法人としては全国健康保険協会ひとつですが、番号は都道府県支部ごとです(平成20年9月18日庁保険発第0918001号)。番号が識別する単位と、法人としての保険者は必ずしも一致しません。

4. 検証番号 ── モジュラス10ウェイト2-1を手計算する

計算対象は、末尾の検証番号を除いた桁列

末尾1桁の検証番号(チェックデジット)は、入力ミスを検出するための数字です。設定要領の手順は次のとおりです。

  1. 検証番号を除いた桁列の右端を起点に、2、1、2、1…を掛ける。
  2. 積を合計する。ただし積が2桁なら、その2つの数字を分けて足す。
  3. 合計の下1桁を10から引く。下1桁が0なら、検証番号も0にする。

これがモジュラス10ウェイト2-1(M10W21)です。第1章の06130488なら、計算対象は末尾の検証番号を除いた0613048。この7桁の右端の8から重みを割り当てます。

項目 1桁目 2桁目 3桁目 4桁目 5桁目 6桁目 7桁目
数字 0 6 1 3 0 4 8
重み(右端起点) 2 1 2 1 2 1 2
積 0 6 2 3 0 4 16
和に足す値 0 6 2 3 0 4 7 ← 1+6

合計は 0+6+2+3+0+4+7=22。下1桁が2なので、検証番号は 10−2=8 です。元の06130488の末尾と一致します。合計の下1桁が0の場合だけは、10ではなく0を使います。

Luhnの「9を引く」と同じ計算になる理由

この計算は、クレジットカード番号などの検査数字に使うLuhnアルゴリズムと実質的に同じです。検証番号を除いた右端の桁から1つおきに2倍し、9を超えたら9を引く、と書くこともできます。

2倍した積は最大18です。たとえば16なら、2桁を分けた1+6も、9を引いた16−9も7になります。10〜18では同じ関係が成り立つため、表現が違っても同じ検算になります。

PythonとC#の例:検算と業務上の確認を分ける

まずは、検証番号を除く桁列から1桁を求めるPythonの最小例です。番号全体の桁数や入力形式を検査する関数ではありません。

def check_digit(code: str) -> int:
    """検証番号を除いた保険者番号の桁列からチェックデジットを求める"""
    total = 0
    for i, ch in enumerate(reversed(code)):
        n = int(ch) * (2 if i % 2 == 0 else 1)
        total += n // 10 + n % 10
    return (10 - total % 10) % 10

assert check_digit("0613048") == 8

医療系の業務アプリで使われるC#の例も示します(.NET Framework 4.xでも.NET 8でも使える範囲の構文です)。CheckDigitは検証番号の計算、IsValidInsurerNumberは6桁または8桁・全桁が半角数字・末尾が計算結果と一致することの確認を担当します。

// 検証番号を除いた桁列からチェックデジットを求める
public static int CheckDigit(string code)
{
    int total = 0;
    for (int i = 0; i < code.Length; i++)
    {
        // 右端を起点に 2,1,2,1… の重みを掛ける
        int digit = code[code.Length - 1 - i] - '0';
        if (digit < 0 || digit > 9)
        {
            throw new ArgumentException("数字以外が含まれています", nameof(code));
        }
        int n = digit * ((i % 2 == 0) ? 2 : 1);
        total += n / 10 + n % 10;   // 積が2桁なら1桁ずつに分けて足す
    }
    return (10 - total % 10) % 10;
}

// 保険者番号(6桁の国保 / 8桁)の末尾1桁を検算する。
// 旧政管の4桁番号は検証番号を持たないため、この関数の対象外とする(第5章)
public static bool IsValidInsurerNumber(string number)
{
    if (string.IsNullOrEmpty(number)) { return false; }
    if (number.Length != 6 && number.Length != 8) { return false; }

    // 全桁を先に見る。末尾1桁だけの検査で済ませると、途中の桁に数字以外が
    // 混ざった入力が CheckDigit まで届き、false ではなく ArgumentException で
    // 返ることになる。OCR・バーコード・手入力を通す以上、ここは bool で
    // 返し切るべき経路
    foreach (char c in number)
    {
        if (c < '0' || c > '9') { return false; }
    }

    int check = number[number.Length - 1] - '0';
    return CheckDigit(number.Substring(0, number.Length - 1)) == check;
}

// CheckDigit("0613048") == 8 / IsValidInsurerNumber("06130488") == true

IsValidInsurerNumberという名前でも、保険者マスタの存在確認や資格確認まではしていません。 trueは、ここで検査した形式と検証番号が合うという意味です。旧政管の4桁でfalseになるのも、この関数の対象外だからであり、過去データとして存在し得ないという意味ではありません。

また、計算用のCheckDigitへは、呼び出し側で確認した空でない桁列を渡します。Pythonの最小例とC#の入力検査付き関数を、同じ入力保証を持つものとして扱わないでください。

右端起点の誤りは、奇数桁だけのテストでは見つからない

重みは右端起点です。ところが保険者番号の検証対象は、8桁番号なら7桁、6桁番号なら5桁と、どちらも奇数です。奇数長では重みの並びが左右対称になるので、左端から2、1…と掛けても結果が一致してしまいます。

危ないのは、同じルーチンを偶数桁の桁列に使い回したときです。たとえば公費負担医療の受給者番号は「受給者区分6桁+検証番号1桁」で、計算対象は6桁。左端から始めると全桁の重みがずれ、誤った検証番号になることがあります。

番号の種類 検証番号を除いた桁数 左端から2、1…と掛けた場合
8桁の保険者番号 7桁 右端起点と同じ割り当てになり、誤実装を見逃す
6桁の国保の番号 5桁 同じく、誤実装を見逃す
設定要領の公費受給者番号 6桁 重みが逆転するため、誤りが表面化し得る

保険者番号だけをテストしても、起点を取り違えたバグは検出できません。 汎用化するなら、偶数桁の計算対象もテストに含めます。

ORCAに残る2001年の修正履歴

ORCAの共通サブプログラムcobol/common/ORCSCHKDGT.CBL(「チェックデジット算出(チェック)」)は、保険者番号に限らず最大20桁の番号を受け取る汎用ルーチンです。修正履歴に、まさに起点の変更が残っています。

*  プログラム修正履歴
* Maj/Min/Rev  修正者       日付      内容
*  01.00.01    MCC-太田     01/04/17  算術式の方法を右端から行う

2000年12月の新規作成から4か月後、2001年4月に「算術式の方法を右端から行う」と修正されています。コメントアウトされた旧コードは左端から重みを掛ける作りでした。奇数桁では一致してしまうという性質が、ここでも注意点になります。

修正後は右端のインデックスをIDYに取り、それを減らしながら重みを掛けます。積が2桁ならWRK-CD2-1 + WRK-CD2-2として合計し、和から検証番号を求める、という設定要領どおりの流れです。25年前の履歴が「右端起点で書き、奇数桁のテストだけで安心しない」という実装上の教訓になっています。

5. 例外の話 ── 旧政管健保の保険者番号は「4桁」だった

現行ルールではなく、旧制度の特例を読む

ここからは過去の番号体系です。平成20年3月版の設定要領の第1の7には、政府管掌健康保険について次の特例がありました。現在の協会けんぽの番号を4桁で扱う、という規定ではありません。

政府管掌健康保険(日雇特例被保険者の保険を除く。)の保険者番号についての特例 政府管掌健康保険(…)の保険者番号については、当分の間、上記1及び3にかかわらず、都道府県番号2桁及び保険者(市町村)別番号2桁を組み合わせた4桁の番号をもって保険者番号とするものとし、この場合の都道府県番号は、社会保険事務所の所在地の都道府県ごとに別表3に定める番号とする。

協会けんぽの前身である政府管掌健康保険(政管健保)は、中小企業の従業員が加入する、加入者数で国内最大級の制度でした。その番号は、次の3点で通常の形と違っていました。

  1. 8桁ではなく4桁で、法別番号も検証番号も含まない。
  2. 都道府県番号は通常の別表2ではなく、専用の別表3を使う。
  3. 保険者は国ひとつでも、番号は社会保険事務所ごとに付く。

都道府県を表す部分が無かったのではありません。通常とは別の番号表だったのがポイントです。たとえば東京は13ではなく21、大阪は27ではなく41でした。

都道府県 通常の都道府県番号(別表2) 政管専用(別表3)
東京 13 21
神奈川 14 31
愛知 23 51
大阪 27 41
福岡 40 75
沖縄 47 82

「当分の間」とされた特例は数十年続き、2008年10月1日の全国健康保険協会(協会けんぽ)発足に伴って解消されました。現在の要領では、協会けんぽは都道府県支部ごとの8桁番号(庁保険発第0918001号)を使います。制度を表す法別番号は政管時代と同じ01ですが、旧4桁番号の中にはその01は含まれていません。

ORCAのソースに残る「政管」の痕跡

制度が切り替わっても、レセコンは過去のデータを扱います。本記事が読む2026年7月公開のORCA 5.2系ソースには、そのための分岐が3つの形で残っています。

その1:入力時は、桁数から制度を推定する

患者登録の保険入力チェックサブcobol/orca12/ORCSP03A.CBLは、桁数を4・6・8のいずれかに限定し、それ以外をエラーにします。そのうえで、保険者マスタに未登録の番号は桁数から制度(ORCA内部の「保険番号」)を推定します。

*        法より編集
EVALUATE    WRK-MOJ-MAX
    WHEN    4
*                政府管掌
        MOVE    "001"           TO  WRK-HKNJA-HKNNUM
    WHEN    6
*                国保
        MOVE    "060"           TO  WRK-HKNJA-HKNNUM
    WHEN    8
*            その他
        PERFORM 1003-HKNNUM-HBTNUM-SEC
END-EVALUATE

4桁は政管(内部コード001)、6桁は国保(060)、8桁は先頭2桁の法別番号からマスタを検索、という分岐です。直前のモジュラス10チェックも「桁数が4より大きいとき」だけ実行され、検証番号のない旧政管4桁は検算しません。過去の特例は、制度判定だけでなく検算の対象にも影響しています。

その2:取り込み時は、旧政管と協会けんぽを読み替える

患者保険情報の取込バッチcobol/orcabt/ORCVTPTHKNINF.CBLには、次の処理があります。

*    協会けんぽ対応
IF      PTHKN-HKNNUM        =   "001"
*        政管で保険者番号が8桁は協会とする
    IF      WRK-LEN             =   8
        MOVE    "009"           TO  PTHKN-HKNNUM
    END-IF
END-IF

「政管(001)として入ってきたが、保険者番号は8桁」というデータを、協会けんぽ(009)へ読み替えます。旧政管と現協会けんぽは内部の保険番号として共存し、桁数が新旧を見分ける手がかりになります。

レセプト集計側のcobol/orcabt/ORCBG014.CBLでは、001と009を「政管は協会に変更になる」というコメントとともに、同じ区分に束ねています。

その3:表示時は、診療日で名称を切り替える

保険名称編集の共通ルーチンcobol/common/ORCSHKNMEI.CBLは、協会けんぽ発足日を定数として持っています。

01  CONST-H201001               PIC X(08)   VALUE   "20081001".
...
IF    ( ORCSHKNMEI-SRYYMD   >=      CONST-H201001 )
 AND  ( COMB-HKNNUM         =      "001" )
        INSPECT COMB-SYU-TANSEIDONAME
                REPLACING    ALL    "政管"   BY  "協会"
END-IF

診療日が20081001以降で内部コードが001なら、短縮名の「政管」を「協会」に置換します。マスタの旧名称を残しながら、診療日に応じて表示を切り替える仕組みです。2008年9月30日以前の診療では「政管」という表示を残せます。

入力・取り込み・表示のそれぞれに、同じ制度変更への対応が必要になる。この点が、単純に番号の桁数だけを統一できない理由でもあります。

6. 保険者番号から「分からないこと」

番号は便利な検索キーですが、読める範囲には限界があります。検証番号が合っていても、次の情報が番号だけで確認できるわけではありません。

確認したいこと 番号だけでは足りない理由・別途必要な情報
個人が誰か 保険者番号が指すのは保険者の単位まで。個人の識別には記号・番号と2桁の枝番などを使う
自己負担割合 同じ制度でも年齢・所得区分で変わる。資格確認の結果などで確認する
保険者の正式名称・連絡先 制度・地域・保険者別番号から、保険者マスタを検索して得る
医療保険の番号か公費の番号か 構造が似ていても別体系。入力欄やデータ項目の種類を区別する

個人の資格と負担割合は、別に確認する

個人を識別するのは、被保険者証の記号・番号と、オンライン資格確認の個人単位化で追加された2桁の枝番です。前回のオンライン資格確認でも、照会条件は保険者番号+記号・番号+枝番の組でした。

また、法別39だから窓口負担は1割、と決めることはできません。負担割合は年齢や所得区分で変わります。資格確認の結果や高齢受給者証などを確認し、限度額認定情報も必要な場面で別途扱います。制度の判定と、患者ごとの負担の判定を分けることが重要です。

保険者の名称と、公費の番号も取り違えない

06130488から「東京の組合健保の048番」と読めても、それがどの組合かはマスタと突き合わせて初めて分かります。番号体系は、名称や電話番号そのものを持っているわけではありません。

生活保護(法別12)や自立支援医療(21)などの公費負担者番号は、医療保険とは別の法別番号表で採番されています。「8桁・法別2桁+都道府県2桁+3桁+検証1桁」という形だけで同一視せず、レセプトと同じく保険と公費を別項目として扱います。

7. ORCAはどう実装しているか ── 2つのマスタと桁数の分岐

「保険番号」と「保険者番号」は別のキー

ORCAには、制度を表す3桁の内部コードである保険番号と、ここまで読んできた保険者番号があります。似た名前ですが、管理する層が違います。

マスタ 管理する層 キーと主な内容
tbl_hknnum(保険番号マスタ) 制度 HOSPNUM, HKNNUM, TEKSTYMD, PAYKBNの複合キー。法別番号・制度名称・負担率・上限額・チェック区分など
tbl_hknjainf(保険者マスタ) 保険者 医療機関番号+保険者番号。名称・郵便番号・住所・電話番号・被保険者証の記号・所属する制度など

制度の属性と検証の強度を、マスタで管理する

tbl_hknnumでは、001=政管、009=協会けんぽ、060=国保、039=後期高齢者などを内部コードで識別します。ただし、主キーは保険番号だけではありません。 医療機関番号・適用開始日・区分を含むため、同じ制度のレコードを適用期間の世代として持てます。

定義ファイルrecord/tbl_hknnum.dbには、法別番号HBTNUM、制度名称SEIDONAME、短縮名TANSEIDONAME、本人・家族×入院・外来ごとの負担率や上限額が並びます。制度改定で属性が変わっても、期間で引き当てられる構造です。番号チェックに関わる項目は次の3つです。

フィールド 役割
HBTNUMCHKKBN 法別番号チェック区分
KENSNUMCHKKBN (負担者番号の)検証番号チェック区分
JKYSKENSNUMCHKKBN 受給者番号の検証番号チェック区分

公費入力チェックサブcobol/orca12/ORCSP03B.CBLでは、負担者番号のモジュラス10チェックはKENSNUMCHKKBN = "1"のときだけ実行されます。受給者番号は区分が"3"なら、エラーではなく確認すれば通せる警告として扱われます。

公費の受給者番号には、自治体ごとに検証番号のない体系も混在します。何を検算し、どの強さで止めるかをマスタで調整することで、制度ごとの違いに対応しています。これは、制度の多様性に25年付き合ってきたレセコンから学べる設計です。

保険者マスタを先に引き、未登録の場合に推定する

record/tbl_hknjainf.dbの保険者マスタは、医療機関番号と保険者番号をキーに、名称・住所・電話番号などと所属制度を持ちます。第5章のORCSP03A.CBLは、次の順で処理します。

  1. 保険者番号の桁数が4・6・8以外ならエラーにする。
  2. 保険者マスタを検索し、登録済みなら名称・住所・給付率・制度の情報を引き当てる。
  3. 未登録なら、4桁超に限ってORCSCHKDGTを呼び、モジュラス10で検算する。
  4. 桁数と法別番号から制度を推定する。4桁は政管、6桁は国保、8桁は法別番号でtbl_hknnumを検索する。

番号体系による推定は、マスタ未登録時のフォールバックです。 マスタを優先し、番号だけから名称などを作り出さない、という2段構えになっています。ここで保険者や制度の情報が引けることと、患者個人の資格が確認できることも別です。

保険者番号のフィールドHKNJANUMはPIC X(08)、つまり数値型ではなく8文字分の文字列領域です。対象スナップショットではCOBOLソース650本以上から参照されています。この型なら、先頭ゼロを数値変換で失いません。領域の長さが8であることと、すべての番号を8桁にゼロ埋めすることは同じではありません。

8. 番号を扱うシステムを作る側の実務ポイント

実装の要点は、元の文字列を守ること、検証の適用範囲を分けること、制度変更に追随できることです。

取り込み時:文字列と元の桁数を守る

  1. 文字列で持ち、数値で持たない。 法別01〜07台の番号には先頭ゼロがあります。ExcelやCSVを経由して7桁などになったら、桁数不足として検知し、エラーや警告にします。
  2. 過去データも扱うなら4・6・8桁を区別する。 現行の新規データは6桁と8桁ですが、旧政管の4桁も過去データとして存在し得ます。安易な「8桁固定・ゼロ埋め」は、旧データや他システムとの突合を壊すおそれがあります。

検証時:掛けられる検査だけを掛ける

  1. 検証番号のある体系だけを検算する。 旧政管4桁や、検証番号のない公費受給者番号へ一律にM10W21を適用しません。ORCAのように対象と検証の強度をマスタで管理し、警告とエラーを使い分けます。
  2. 法別番号による分岐はマスタ駆動にする。 提出先の判定などに使う制度との対応表を、コードに直書きせずテーブルへ持たせます。法別番号は制度改正で追加されてきたため、将来の変更にも対応できる形にします。

データ設計:番号の種類と資格情報を分ける

  1. 保険者番号と公費負担者番号を同じ列に入れない。 形が同じでも別体系です。別項目として持ち、突合キーには番号の種類も含めます。
  2. オンライン資格確認の時代にも使うキーとして設計する。 マイナ保険証への移行後も、照会・応答XMLのInsurerNumberやレセプトの請求先判定に保険者番号が登場します。「いずれ消える番号」と考えず、資格情報の基幹キーとして扱います。

9. まとめ

保険者番号を扱うときは、読む・検算する・マスタで確認するを分けると整理できます。

  • 読む: 原則の8桁は法別2桁+都道府県2桁+保険者別3桁+検証1桁。国保(退職者医療を除く)は法別なしの6桁です。番号から制度・請求先の区分・保険者の地域は読めますが、個人・負担割合・正式名称までは決まりません。
  • 検算する: M10W21は、検証番号を除いた右端から2、1…と掛けます。奇数桁だけのテストでは起点の誤りを見逃します。ORCAのORCSCHKDGT.CBLにある2001年の修正履歴も、この注意点を示しています。
  • マスタで確認する: ORCAは制度と保険者を二層で管理し、未登録時だけ番号体系から推定します。文字列で先頭ゼロを守り、制度ごとに検証を切り替える設計は、医療以外の業務コードにも応用できます。

歴史的な例外は、専用の都道府県番号表を使う旧政管の4桁です。「当分の間」の特例が数十年続き、2008年10月の協会けんぽ発足で8桁へ移りました。その痕跡は対象の2026年公開ソースに、桁数による推定、取込時の001から009への読み替え、診療日による「政管」から「協会」への表示切替として残っています。

シリーズ次回は、当初の予告どおりレセプトの点検・査定のロジックを扱います。医療機関内のデータチェックと審査支払機関側のコンピュータチェックがそれぞれ何を見ているのかを、同じくソースと公開資料から分解します。

10. 参考資料

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

この記事は次のサービスページにつながります。近い入口からご覧ください。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

保険者番号から個人を特定できますか?
できません。保険者番号が識別するのは「どの保険者(協会けんぽ○○支部、○○健康保険組合、○○市の国保など)か」までです。個人の識別は被保険者証の記号・番号(オンライン資格確認の個人単位化で追加された2桁の枝番を含む)が担っており、保険者番号とは別の項目です。
保険者番号が6桁の保険証と8桁の保険証があるのはなぜですか?
国民健康保険(退職者医療を除く)だけは、法別番号を持たない6桁(都道府県番号2桁+保険者別番号3桁+検証番号1桁)と定められているためです。被用者保険(協会けんぽ・組合健保・共済など)と後期高齢者医療、国保の退職者医療(法別67)は、法別番号2桁を先頭に付けた8桁です。
保険者番号の最後の1桁は何の数字ですか?
検証番号(チェックデジット)です。末尾を除く各桁に右端から順に2、1、2、1…を掛け、積が2桁になれば1桁ずつに分けて合計し、その和の下1桁を10から引いた数(下1桁が0なら0)が検証番号になります。いわゆるモジュラス10ウェイト2-1方式で、入力ミスの多くをこの1桁で検出できます。
昔の協会けんぽ(政府管掌健康保険)の保険者番号が4桁だったというのは本当ですか?
本当です。厚生労働省の設定要領に「政府管掌健康保険の保険者番号は当分の間、都道府県番号2桁+保険者別番号2桁の計4桁とする」という特例が明記されていました。しかも都道府県番号は通常の表とは別の専用表(東京=21、大阪=41など)でした。2008年10月の協会けんぽ発足に伴い、都道府県支部ごとの8桁番号に切り替えられています。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る