MS Access Tips/Sample and VBA and Blog customize etc...

クエリの式の簡略化のアイデア

区切り文字(全角空白or半角空白)より前を取り出す。
前後を"("と")"で囲まれているときは、"("、")"は削除する。
ただし、区切り文字が含まれないときは、"("、")"も含めてそのまま表示。
クエリ上で上記のような仕様で表示する演算フィールドを作成したいのですが。

上記のような質問が掲示板でありました(アレンジしてありますが)。

複雑な仕様だとユーザー定義関数を作成した方いいのですが、このぐらいならぎりぎり演算フィールドに式を記述するのではいけそうです。

ただし、工夫しないと長大な式になります。この仕様をケーススタディとして、式を簡略化するアイデアのいくつかを紹介します。

難易度:

サンプルデータ


テーブル1
所属学部
東京大学 文学部
(青山学院大学 理工学部)
明治大学 経済学部
(財)21世紀職業財団
(財)21世紀職業財団 本部
(青山学院大学)

上記のデータをクエリ上で下記のように表示させたい。

クエリ1
所属
東京大学
青山学院大学
明治大学
(財)21世紀職業財団
(財)21世紀職業財団
(青山学院大学)

区切り文字の前を取り出し

まずは、全角空白or半角空白 より前を取り出す式。

これで取り出すことができますが、区切り文字が含まれてなかったり、フィールドがNull値だと、エラーになります。エラー回避するためには、普通に考えると IIfで場合分け、Nz関数でNullを変換、という下記のような式になります。

同じInStr式が繰り返されて、冗長感が拭えません。

これで、Nullでも " " を含まなくてもエラーになりません。
元の式に、& " " を追加しただけです。
区切り文字が含まれてないとエラーになるのだから、それを追加してやれ、という発想です。

区切り文字の後半部分を取り出す場合も同じ手法が使えます。

前後を括弧で囲まれているとき

前括弧を削除するかどうか、IIfで場合分けすることになりますね。また、「前後を括弧で囲まれているとき」という条件を式にするときは、Like演算子を使うとシンプルにできます。

IIfの構文は、IIf(条件式, 真の場合の式, 偽の場合の式)となりますので、素直に式にすると下記のようになります。

Left(・・・・) の部分が繰り返しになって冗長です。

IIfを Midの第2引数にいれて、取り出し開始位置を場合分けします。繰り返しがなくなりました。

区切り文字が含まれないとき

ここまでくれば簡単ですね。IIfの条件のLike式に区切り文字が含まれるというのを追加するだけです。

もし、簡略化のアイデアを取り入れないと、下記のように式になりました。

これでは後から見たら、何が何だか分かりませんね。とても、クエリのフィールド欄に記述しておく気にはなりません。ユーザー定義関数を作成する方向へ走りますね。

前者の式なら、なんとかフィールド欄に記述してもいいかな、という長さだと思いますが、いかがでしょうか。

他にも簡略化のテクニックはあります。例えば、IIf を使わずに下記のようにすることもできます。

これは、Accessでは、Trueは-1、Falseは0 になっていることを利用しています。

このように工夫することはなかなか楽しいのですが、あまり技巧に走りすぎて後から見て解読困難になっては本末転倒なので、ほどほどにしておくということも大切です。


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/285-96e3eada
該当の記事は見つかりませんでした。