記事概要
AccessのクエリでWHERE文を用いる際、意図しないレコードを抽出してしまうことがあります。
それは、半角・全角・ひらがな・カタカナ・大文字・小文字といった文字形式のみ違う場合です。原因はバイナリモードではなく、テキストモードで抽出をかけてしまうからだそうです。
例えば、次のようなテーブルがあったとします。
テーブル名:tbl_Fruit
ID | Fruit |
---|---|
1 | みかん |
2 | ミカン |
3 | ミカン |
4 | 蜜柑 |
5 | MIKAN |
6 | mikan |
この時、Accessで次のクエリ文を流します。
example.sql
SELECT ID, Fruit FROM tbl_Fruit
WHERE Fruit = 'みかん'
すると、次のレコードが抽出されます。
ID | Fruit |
---|---|
1 | みかん |
2 | ミカン |
3 | ミカン |
上表の通り、想定した結果「みかん」と違うレコードが抽出されてしまいます!
2 解決方法 strComp関数
解決方法として、strComp関数を用いることで解決できます。
実装では次のようなクエリ文を作成しました。
example.sql
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
以上。