記事概要
AccessのクエリでWHERE文を用いる際、意図しないレコードを抽出してしまうことがあります。
それは、半角・全角・ひらがな・カタカナ・大文字・小文字といった文字形式のみ違う場合です。原因はバイナリモードではなく、テキストモードで抽出をかけてしまうからだそうです。
例えば、次のようなテーブルがあったとします。
テーブル名:tbl_Fruit
| ID | Fruit |
|---|---|
| 1 | みかん |
| 2 | ミカン |
| 3 | ミカン |
| 4 | 蜜柑 |
| 5 | MIKAN |
| 6 | mikan |
この時、Accessで次のクエリ文を流します。
SELECT ID, Fruit FROM tbl_Fruit
WHERE Fruit = 'みかん'
すると、次のレコードが抽出されます。
| ID | Fruit |
|---|---|
| 1 | みかん |
| 2 | ミカン |
| 3 | ミカン |
上表の通り、想定した結果「みかん」と違うレコードが抽出されてしまいます!
2 解決方法 strComp関数
解決方法として、strComp関数を用いることで解決できます。
実装では次のようなクエリ文を作成しました。
SELECT ID, Fruit FROM tbl_Fruit
WHERE strComp(Fruit,'みかん',0) = 0
strComp関数の補足
strComp関数の引数は次の通りです。
| 引数項番 | 引数内容 | 引数説明 |
|---|---|---|
| 1 | string1 | string2と比較する文字列。 |
| 2 | string2 | stirng1と比較する文字列。 |
| 3 | compare | 比較形式。省略可能。 |
比較形式について、値が"0"の時はバイナリモードで比較を行い、値が"1"の時はテキストモードで比較を行います。
今回はバイナリモードで比較を行うため、値を"0"にしています。
strCompの戻り値は次の通りになります。
| 戻り値 | 条件 |
|---|---|
| -1 | string1 < string2 |
| 0 | string1 = string2 |
| 1 | string1 > string2 |
| NULL | string1 またはstring2がNull |
今回はstring1とstring2がバイナリモードで等しくなる場合のみ抽出したいため、戻り値を"0"と条件づけています。
▼strComp関数の詳細(MSDN)
https://msdn.microsoft.com/ja-jp/library/cc410330.aspx
以上。