• ベストアンサー

SQLクエリ

以下のようなAccessのテーブルがあったとします。   time  -------------- (1) 200207050545 (2) 200207050546 (3) 200207050733 そこで、以下のようなクエリを実行したとします。 SELECT time from table WHERE time <= '200207050546' 当然、得られる結果は(1)(2)です。 しかし、条件を『time <= 'a'』にすると、(1)(2)(3)の結果が得られてしまいます。 条件が『time <= 'a'』のときはレコードなしにしたいのですが、 どうすればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • 20020718
  • ベストアンサー率48% (13/27)
回答No.6

>条件はオペレータが入力します。 とのことですが、よくわからないので、 とりあえず、入力した文字は、 変数 x に入るもの(sqlを直接入力しない)と仮定します。 SQL = "SELECT time from table" SQL = SQL & "WHERE time<=IIf(IsNumeric('" & x & "'),'" & x & "','0') SQL を実行 とすると、変数 x に「a」 や、「12a34」などが入っていた場合は、 「0」とみなされますので、 データの表示はされなくなると思います。 的外れならすいません。。。

snowsaab
質問者

お礼

そうですよね。 まず、数値か文字かを判断してやればよかったんですよね。 期待通りの結果が得られました。 ありがとうございましたm(__)m

その他の回答 (7)

  • DrSumire
  • ベストアンサー率39% (264/666)
回答No.8

すみませんBettweenは思いっきり勘違いしてSQLにしてしまいました SQLで絞るのは難しいと思うので VBのTEXTBOXのKEYPRESSイベントで入力制限をかけるのがよいと思います。 if not ((Key >= '0') and (Key <= '9')) then Key = NULL; とかにすると、0~9までのキーが入力された場合はTEXTBOXに入力され、 それ以外のキーが押されても何も入力されないと思います。 Enter BS TAB はKEYDOWNイベントで処理されたと思うのですが、 もしかすると必要なキーを上記の式から条件ではじく必要もあるかも VBはしばらく使ってないのでちょっと当てにならないですかど 入力制限は比較的簡単にできると思うのでVB側でコントロールしたほうが よいと思われます。 TEXTBOXのプロパティでマスク入力があった気もするのですが、 よく覚えていません、確認してみてはいかがですか? あとは強引ですが SELECT time, 'xxx' as JOUKEN from table WHERE (time <= 'xxx') and (JOUKEN between '0'and '999999999999') とかはどうでしょう? AccessのSQLだとできるか確認していませんが・・・・

snowsaab
質問者

お礼

SQLを実行する前にチェックを入れるのが妥当でした。 いろいろ考えてくださって、ありがとうございましたm(__)m

  • borg
  • ベストアンサー率56% (42/75)
回答No.7

求めているものがずれていたようで、 '999999999999'のところにこの例の条件の数値'200207050545'を入れるつもりでした。 SELECT time from table WHERE (time between '000000000000'and '条件値') でもだめですか? 本来日付でいうならば'000000000000'のところも現実的に考えられる最小値を12桁で定義すべきなのかもしれませんが・・・

snowsaab
質問者

お礼

説明が足りてなくて申し訳ないです。 確かに、正常な日付が条件値に入ってきた場合はこれでよいのですが、 エラー値(例えば『a』などの文字)が入ってきた場合が、 このクエリでは期待通りの結果が得られませんでした。 ですので、条件値には日付式しかこないように、事前にチェックを入れるように 変更しました。 いろいろ考えてくださって、ありがとうございましたm(__)m

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

こんにちは。maruru01です。 オペレーターの誤入力はSQLの実行より前にチェックするのが一般的ではないですか。 仮に、コマンドボタンをクリックしてSQLを実行するということなら、クリックイベントの最初に入力文字をチェックして、誤入力ならキャンセルするとか。 また、VBで作っているなら、入力用のテキストボックスに、マスクエディットコントロールを使って、指定した桁の数字以外受付ないようにすることも出来ます。 とにかく、SQL文で誤入力を吸収するのは無理があると思います。

snowsaab
質問者

お礼

おっしゃるとおりですよね。 SQLで制御するのは、かなり無謀でした・・・。 よって、SQLを実行する前にチェックを入れるようにしました。 ありがとうございましたm(__)m

  • borg
  • ベストアンサー率56% (42/75)
回答No.4

入力が日付でかつ桁数がきまっているならば単純に SELECT time from table WHERE (time between '000000000000'and '999999999999') ではだめでしょうか?

snowsaab
質問者

補足

入力が日付でかつ桁数は決まっています。 しかし、条件が『time <= '200207050545'』のようにありますので・・・。 SELECT time from table WHERE (time between '000000000000'and '999999999999') この場合、すべて引っかかってしまいますよね?

  • DrSumire
  • ベストアンサー率39% (264/666)
回答No.3

SELECT time from table WHERE (time <= 'xxx') and (time between '0'and '999999999999') などとすれば xxxに'a'が入っても'200207050546'が入っても求めたい結果が出ますけど・・・ どういった状況で'a'が条件に入るのかがわからないので的確かどうかわかりません。 SQLをジェネレートする以前で本来は解決する問題のような気がします。

snowsaab
質問者

補足

説明不足ですみません。 これはVBで作っているのですが、条件はオペレータが入力します。 なので、日付をキーにして入力された日付以下のものを検索したいのです。 しかし、オペレータが間違って日付の代わりに『a』を入力してしまった、 という設定で、レコードは求まらないようにしたいのです。 SELECT time from table WHERE (time <= 'xxx') and (time between '0'and '999999999999') でやってみましたが、求まってしまいました。

  • TMINET
  • ベストアンサー率32% (45/140)
回答No.2

'a'でなくてはいけないのでしょうか? そうでないなら'+','-','$','&'など0より小さい文字コードは色々ありますけど。

snowsaab
質問者

補足

'a'でなくてもよいのですが、'a'や'あ'などが期待通りの結果が 得られなかったもので・・・。

  • Fat01ton
  • ベストアンサー率46% (122/264)
回答No.1

レコード無しでいいのなら 条件を『time <= 'a'』から 『time = 'a'』にすれば良いのでは? 正直自信はありません。 勘違いの回答でしたらすいません。

snowsaab
質問者

補足

すいません。説明不足ですね。 条件を『time <= 'a'』にしますと、 レコードが抽出されてしまうのです。 文字コードの関係だとは思うのですが・・・。 しかし、AccessではASC(2)関数が使えないようなので。 何かよい方法はないものかと思いまして・・・。

関連するQ&A