住所から都道府県を抽出する

 住所のうち都道府県だけを分けて表示するというのは多くの人が経験する作業かと思います。具体的には都道府県と市区町村以下をそれぞれ抽出する、つまり住所を分割するというケースが多いかと思いますので、そこまでを含む方法を紹介します。
 なお、例として右のテーブル「顧客テーブル」を用いて、都道府県と市区町村以下をそれぞれ抽出するものとします。


例1:関数による方法

 早くて簡単なのは関数に頼る方法です。記録されている住所が都道府県名から始まっていることが確実な場合、あるいはそうでなくても許容できる場合(目視で修正できる場合等)に向いています。
 クエリデザインの画面で顧客テーブルを置き、次のような2つの列を設ければOKです。

都道府県: Left([住所],IIf(Mid([住所],4,1)="県",4,3))
市区町村以下: Replace([住所],[都道府県],"",1,1)

 都道府県を抽出するにあたっては、都道府県名が何文字であるかを特定することが必要ですが、「都」「道」「府」「県」の文字をすべて検索して位置を特定しようとすると長くなります。(「県」を含めて)4文字になるのは「神奈川県」「和歌山県」「鹿児島県」の3つだけ、つまり4文字目が「県」である場合のみですので、その場合は4文字を抽出、そうでない場合は3文字を抽出するというわけです。

 クエリデザインでの入力の様子はこのようになります。
 なお市区町村以下を抽出するにあたってはReplace関数を使い、都道府県の部分を空文字に置き換えています。引数の4番目の「1」は「1文字目から検索開始」、5番目の「1」は「該当する最初の1個だけ置き換える」の意味です。住所中に県名が2回以上現れても、最初のものだけが置き換えられる(消える)というわけです。
 ちなみに都道府県については、以下のようにしても同じ結果となります。

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

 また、市区町村以下については、以下のようにしても同じ結果となります。

市区町村以下:Mid([住所],Len([都道府県])+1)


 データシートビューはこのようになります。住所が正しい都道府県名から始まっているかどうかは判断できないため、記録されている住所の内容によっては適切といえない結果となり得ます。


例2:都道府県テーブルによる方法

 住所が正確な都道府県名から始まっているかチェックする必要があるのであれば、一時的にであれ都道府県テーブルを作成し、それに基づいて都道府県を抽出するのがよい方法です。
 

 まず、このような都道府県テーブルを設けます。


 クエリデザインの画面で顧客テーブルを置き(都道府県テーブルは置かない)、次のような列を設ければOKです。

都道府県: (select [都道府県名] from 都道府県テーブル where [住所] like [都道府県名]&"*")
市区町村以下: Replace([住所],[都道府県],"",1,1)

 クエリデザインはこのようになります。都道府県は(相関)サブクエリによる抽出となっていますので、繰り返しですがクエリデザインに都道府県テーブルを置かないようにしてください。


 データシートビューはこのようになります。住所が、都道府県テーブルに記録されている都道府県名から始まっていない場合には、都道府県は空白となります。

補足:市区町村の抽出について

 そもそも市区町村の数は多く、字数もまちまちですので例1のようにはいきませんし、Instr関数を使うなどして「市」や「町」の位置を特定するにしても「四日市市」「玉村町」といった名称に対応できないという問題があります。実行するとすれば例2のようにテーブルによる抽出を行うべきと考えられます。