住所を都道府県と市区町村に分けて表示するには

[Access 2016/2013/2010/2007]

下図のような[T_住所録]テーブルの[住所]フィールドに入力されている住所から、都道府県とそれ以降の住所を別々に取り出してみましょう。下図ではすべてのレコードに都道府県名が入力されていますが、されていない場合の取り出し方も紹介します。

スポンサーリンク

Case1.都道府県名が確実に入力されている場合

手順ダイジェスト

都道府県: Left([住所],IIf(Mid([住所],4,1)="県",4,3))

市区町村: Replace([住所],[都道府県],"")

手順解説

[住所]フィールドに都道府県名が確実に入力されているなら、考え方はとても簡単。都道府県名の文字数は、「神奈川県」「和歌山県」「鹿児島県」が4文字で、それ以外は3文字です。したがって、

  • 住所の4文字目の文字が「県」である → 住所の先頭4文字が都道府県名
  • 住所の4文字目の文字が「県」でない → 住所の先頭3文字が都道府県名

と考えられます。

場合分けのIIf関数構文1)、文字列から部分的に文字を取り出すMid関数構文2)、文字列の先頭から文字を取り出すLeft関数構文3)を使用して、式1のように式を立てると、住所から都道府県を取り出せます。

構文1 式の真偽に応じて値を切り替える
IIf(式, 真の場合, 偽の場合)

構文2 文字列の指定した位置から部分文字列を取り出す
Mid(文字列, 開始位置, 文字数)

構文3 文字列の左端から部分文字列を取り出す
Left(文字列, 文字数)

式1 [住所]の4文字目が「県」である場合は4文字、そうでない場合は3文字を[住所]の先頭から取り出す
都道府県: Left([住所],IIf(Mid([住所],4,1)="県",4,3))

[住所]フィールドの文字列から都道府県名を削除すれば、市区町村以降を取り出せます。文字列から特定の文字列を削除するには、Replace関数(構文4、正式な構文はReplace関数のページを参照)を使用します。式2のように、Replace関数の引数[文字列]に[住所]、引数[検索文字列]に[都道府県]、[置換文字列]に「""」(長さ0の文字列)を指定すれば、住所から都道府県名を取り除けます。

構文4 文字列内の検索文字列を置換文字列に置き換える
Replace(文字列, 検索文字列, 置換文字列)

式2 [住所]から都道府県名を取り除いた文字列を取り出す
市区町村: Replace([住所],[都道府県],"")

式1式2を使用して、住所から都道府県とそれ以降を取り出したクエリが図1図2です。

図1 クエリの[フィールド]欄に式1式2を入力する。

図2 住所から都道府県とそれ以降を取り出せた。

繰り返しになりますが、この方法が使えるのは、[住所]フィールドに確実に都道府県名が入力されている場合です。住所に必ずしも都道府県名が含まれない場合、そのようなレコードでは図3のように市区町村名の先頭3文字が取り出されてしまい、うまくいきません。

図3 都道府県名を含まない場合、都道府県名として誤って住所の先頭3文字が取り出されてしまう。

Case2.都道府県が含まれない場合に対応(関数で対応)

手順ダイジェスト

都道府県: IIf(Mid([住所],3,1) In ("都","道","府","県"),Left([住所],3),IIf(Mid([住所],4,1)="県",Left([住所],4),""))

市区町村: Replace([住所],[都道府県],"")

手順解説

住所に必ずしも都道府県名が含まれない場合の対処方法を考えましょう。

簡易的に対処するには、IIf関数を入れ子で使用して、住所の3文字目と4文字目を調べます。1つ目のIIf関数で3文字目を調べ、「都、道、府、県」のいずれかであれば都道府県名として3文字取り出します。そうでない場合は2つ目のIIf関数で4文字目を調べ、「県」であれば都道府県名として4文字取り出します。そうでない場合は都道府県名が入力されていないとみなして、「””」(長さ0の文字列)を返すようにします(式3図4)。

  • 住所の3文字目の文字が「都、道、府、県」のいずれかである
     → 都道府県名として住所の先頭3文字を取り出す
  • 住所の4文字目の文字が「県」である
     → 都道府県名として住所の先頭4文字を取り出す
  • 上記以外
     → 住所に都道府県名が含まれないので「""」を返す

なお、式中の「Mid([住所],3,1) In ("都","道","府","県")」に含まれるIn演算子は、「フィールド名 In ("red","blue","green")」のように記述して、フィールドの値が丸カッコ内の値セットの中にある場合はTrue、ない場合はFalseを返す演算子です。

式3 3文字目が「都、道、府、県」の場合は3文字、4文字目が「県」の場合は4文字を取り出す
都道府県: IIf(Mid([住所],3,1) In ("都","道","府","県"),Left([住所],3),IIf(Mid([住所],4,1)="県",Left([住所],4),""))

図4 [都道府県名]フィールドに式3、[市区町村]フィールドに式2を使用。都道府県名が含まれていないに[都道府県]フィールドに何も表示されなくなった。

ただし、[住所]フィールドに都道府県名が含まれていない場合でも、市区町村名の3文字目が「都、道、府、県」であるか、4文字目が「県」である場合、図5のように誤った都道府県名が取り出されてしまいます。式3を使用する場合は、使用後に必ず不具合がないかチェックしましょう。不具合を見つけた場合や、レコード数が多すぎてチェックしきれない場合は、次節のCase3の方法を使用しましょう。

図5 「福岡県太宰府市」や「宮崎県東諸県郡(ひがしもろかたぐん)」のような住所に県名が含まれない場合、都道府県名として「太宰府」や「東諸県」が取り出されてしまう。

Case3.都道府県が含まれない場合に対応(都道府県テーブルで対応)

手順ダイジェスト

都道府県: (SELECT [都道府県名] FROM T_都道府県 WHERE [住所] Like [都道府県名]&"*")

市区町村: Replace([住所],Nz([都道府県],""),"")

手順解説

[住所]フィールドから確実に都道府県名を取り出すには、面倒ですが47都道府県を入力したテーブルを用意します(図6)。ここでは、テーブル名を「T_都道府県」としました。

図6 都道府県名を入力したテーブルを用意する。

あとは、「相関サブクエリ」という仕組みを利用して、式4のように式を立てます。サブクエリを使いこなすにはSQL(リレーショナルデータベースを操作するための言語)の知識が必要です。ここでは掘り下げませんが、[T_住所録]テーブルの各レコードに対して、[T_都道府県]テーブルのレコードを順に比較していくイメージです。[T_住所録]テーブルの[住所]が[T_都道府県]テーブルの[都道府県名]で始まる場合に[都道府県名]を返しています。

なお、クエリを作成する際に、デザインビューに追加するのは[T_住所録]だけです。[T_都道府県]テーブルを追加しないように注意してください。

式4 [T_都道府県]テーブルの都道府県を含む場合だけ住所から都道府県を取り出す
都道府県: (SELECT [都道府県名] FROM T_都道府県 WHERE [住所] Like [都道府県名]&"*")

式4では、[住所]フィールドに都道府県名が含まれない場合にNullが返されます。その場合、式2のように「市区町村: Replace([住所],[都道府県],"")」としてしまうと、第2引数がNull値となってしまいエラーが発生します。それを防ぐために、Nz関数構文5)を使用してNull値を「""」で置き換え、式5のように式を立ててください(図7)。

構文5 Null値をほかの値に変換する
Nz(データ, Nullの代替値)

式5 [都道府県]がNullの場合に対処する
市区町村: Replace([住所],Nz([都道府県],""),"")

図7 [都道府県名]フィールドに式4、[市区町村]フィールドに式5を使用。都道府県名だけが取り出されるようになった。

メモ

そもそも[住所]が未入力(Null)の場合
[住所]フィールドが未入力の場合、式2式5のReplace関数にエラーが出ます。このエラーが出ないようにするには、第2引数に指定した「[住所]」を「Nz([住所],"")」のように変えてください。
スポンサーリンク

関連記事