質問: "A-1",1,0) とかだと、クエリとSQLの結果に違いはありません。 IIfだけでなくSwitchを使った場合も同様(LIKEだとおかしい、=だと平気)でした。 ちなみに、Accessのバージョンは2003、VBAで使っているレコードセットはADODBです。 (今確認したところ、DAOでは問題なくできました。) 冒頭で、困っていると書きましたが、これを回避する方法はいくつか思いついていますので、 別の方法を教えていただきたいわけではなく、単純になぜこのようなことが起きるのかが知りたいです。 是非よろしくお願いします。
回答: > Like "A*" ADO では Like "A%" になると思います。 こういうことではなく、なぜかっていうことになりますか・・・ Access 2003 / 2007 で確認してみました。 Private Sub CheckDAO(sS As String, sSql As String) Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset(sSql) While (Not rs.EOF) Debug.Print "DAO" & sS & " : ", Debug.Print "顧客id=" & rs("顧客id"), Debug.Print "商品id=" & rs("商品id"), Debug.Print "式1=" & rs("式1") rs.MoveNext Wend rs.Close Set rs = Nothing End Sub Private Sub CheckADO(sS As String, sSql As String) Dim rs As New ADODB.Recordset rs.Source = sSql rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly While (Not rs.EOF) Debug.Print "ADO" & sS & " : ", Debug.Print "顧客id=" & rs("顧客id"), Debug.Print "商品id=" & rs("商品id"), Debug.Print "式1=" & rs("式1") rs.MoveNext Wend rs.Close End Sub Public Sub test21() Const CSQL As String = "SELECT * FROM q_test;" Const CSQL2 As String = "SELECT * FROM q_test2;" Call CheckDAO("", CSQL) Call CheckADO("", CSQL) Call CheckDAO("2", CSQL2) Call CheckADO("2", CSQL2) End Sub クエリ q_test2 は、 A* を A% に変更しただけのもので、 test21 を実行した結果は以下 DAO : 顧客id=1 商品id=A-1 式1=1 DAO : 顧客id=2 商品id=A-2 式1=1 DAO : 顧客id=3 商品id=B-1 式1=0 DAO : 顧客id=4 商品id=A-1 式1=1 ADO : 顧客id=1 商品id=A-1 式1=0 ADO : 顧客id=2 商品id=A-2 式1=0 ADO : 顧客id=3 商品id=B-1 式1=0 ADO : 顧客id=4 商品id=A-1 式1=0 DAO2 : 顧客id=1 商品id=A-1 式1=0 DAO2 : 顧客id=2 商品id=A-2 式1=0 DAO2 : 顧客id=3 商品id=B-1 式1=0 DAO2 : 顧客id=4 商品id=A-1 式1=0 ADO2 : 顧客id=1 商品id=A-1 式1=1 ADO2 : 顧客id=2 商品id=A-2 式1=1 ADO2 : 顧客id=3 商品id=B-1 式1=0 ADO2 : 顧客id=4 商品id=A-1 式1=1 クエリを直接開いた時の表示は、 「q_test」 顧客id 商品id 式1 1 A-1 1 2 A-2 1 3 B-1 0 4 A-1 1 「q_test2」 顧客id 商品id 式1 1 A-1 0 2 A-2 0 3 B-1 0 4 A-1 0 ANSI-92 / ANSI-89 ・・・なんちゃらがあり (DAO / ADO の違いについてのお話ではないと思いますが・・・) ツール→オプションを表示し、 「テーブル/クエリ」のSQLサーバー互換構文(ANSI 92)の 「このデータベース」のチェックを入れ、クエリを直接開くと結果は逆になります。 でも、DAO / ADO での取得(test21 の実行)結果は変わりません。 この辺の動きを説明されているのが以下でしょうか(拡大解釈かも) ADOとDAOを使用したwhere句内の文字列検索にて、*と%の動きの違い クエリ名で指定しても、その内容の全ての解釈は統一された、 という事になるのでしょうか。(私の解釈ですけど) うそかも・・・ 自己責任にて解釈してください。