- 締切済み
あいまい検索 続
1月から12月 空白を含む検索で前回教えていただいた者です。アクセスでLike [条件] & "*" or is null and [条件] is nullで検索条件を空白にすると すべて1から12月と空白が検査できました。しかし、1月のみ10月11月12月もでてしまいます。1を指定したとき1月のみでる方法がございましたら教え下さい。お願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- 5qoo
- ベストアンサー率48% (20/41)
>Like [条件] & "*" 原因はこれではないでしょうか? これだと、1月の場合は"1*"となり"1"と1の後ろに何か入力された値= "1月、10月、11月、12月"がもちろん抽出対象になります。 抽出をBetween関数を使って開始と終了の期間を指定すればどうでしょう。
- CHRONOS_0
- ベストアンサー率54% (457/838)
対象フィールドには1月1日、10月2日というような文字列が入っており 条件には月の数字部分だけを入れるということを徹底すれば Like [条件] & "月*" or is null and [条件] is null
お礼
書式を変換して試します ありがとうございました。
s_husky です。回答にミスがありましたので訂正! [イミディエイトウィンドウ] ? DBLookup("SELECT ID, 月 FROM テーブル1 WHERE 月 LIKE '[1]*' or 月 is null") 1;1月;4; はミス!10、11、12もヒットします。 [イミディエイトウィンドウ] ? DBLookup("SELECT ID, 月 FROM テーブル1 WHERE 月 LIKE '1*' or 月 is null") 1;1月;4; が正解。
お礼
むづかしくてまだ試していませんが、勉強してやってみます
やっと、失敗の原因が判りましたので回答します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ その前に、Access では[イミディエイトウィンドウ] が提供されています。 これを利用すれば、SQL 文を簡単にテストすることが可能です。 クエリですと、少々、確認に手間隙がかかりますのでテスト環境の利用も併用されたらどうでしょうか? <テーブル1> ID 月 1 1月 2 2月 3 3月 4 5 5月 というテーブルがあった場合、 [イミディエイトウィンドウ] ? DBLookup("SELECT ID, 月 FROM テーブル1 WHERE 月 LIKE '[1]*' or 月 is null") 1;1月;4; と WHERE節をテストすることが可能です。 この場合、ID=1、ID=4 のレコードがヒットしています。 なお、<and [条件] is null>は Or と同じ条件の併記ですので無駄と思います。 <テーブル1> ID 月 月次 1 1月 1月 2 2月 2月 3 3月 3月 4 5 5月 5月 列[月次]は、日付型です。 ? DBLookup("SELECT ID, 月, 月次 FROM テーブル1 WHERE 月次 LIKE '2006/01*' or 月次 is null") 1;1月;2006/01/01;4;; ? DBLookup("SELECT ID, 月, 月次 FROM テーブル1 WHERE 月次 LIKE '[2006/01]*' or 月次 is null") 1;1月;2006/01/01;2;2月;2006/02/01;3;3月;2006/03/01;4;;;5;5月;2006/05/01 最初は、目的通りの結果を得ています。 が、2度目は、全てを取得しています。 これは、Like文の文法上、当然の結果です。 *DBLookup()のテストをしたら、偶然に2番目の書き方をして判明した次第です。 <s_husky sql リファレンスより>************************************************************************************************************** WHERE <文字型列> LIKE '<値>' <文字型列>には、CHAR型の列の名前を記述し<値>には文字列をシングルクォーテーション(’)で囲んで指定します。 <値>の文字列には、次のようなワイルドカード文字列を使うことができます。 *______ 0個以上の文字に対応します。 ?______ 任意の1文字に対応します。 [...]____ 各カッコ内に指定した文字に対応します。 [^...]___ 各カッコ内に指定した文字以外に対応します。 ******************************************************************************************************************* 次は、私が考えた DBLookup() です。 DAO を利用していますので、参照設定で DAO を組み込む必要があります。 役に立てば幸いです。 Public Function DBLookup(ByVal strQuerySQL As String) As String On Error GoTo Err_DBLookup Dim I As Integer Dim N As Integer Dim Datas As String Dim dbs As DAO.Database Dim rst As DAO.Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset(strQuerySQL) With rst Do Until .EOF N = .Fields.Count - 1 For I = 0 To N Datas = Datas & .Fields(I) & ";" Next I .MoveNext Loop End With Exit_DBLookup: On Error Resume Next rst.Close dbs.Close DBLookup = Left(Datas, Len(Datas) - 1) Exit Function Err_DBLookup: Datas = "" MsgBox Err.Description Resume Exit_DBLookup End Function
=[条件] or is null and [条件] is null でいかがでしょうか? (あいまい検索ではないですけれど)
お礼
残念できませんでした。さっそくの回答ありがとうございました。
お礼
ありがとうございます。たしかにBETWEENだとエラーはないと思います。しかし、コンボでワンクリックが好みで難しいですね