- ベストアンサー
WHERE句の?
お世話になります よろしくお願いします。 さっそくで申し訳ないのですが SQL分で SELECT test01 FROM test WHERE test01 = ? の「?」というのはどういう意味があるのでしょうか? 以上よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
select文の検索条件を変数で与えたい場合、 select * from t1 where c1=変数名 といった書き方をしますよね? それでは、select文を文字列で組み立て、動的実行をすることを考えましょう。 'select + from t1 where c1=' と値を部分を文字結合し、prepareしexecuteで実行する場合、値を定数で指定すると、値が変わるたびにprepareをやり直さなくてはなりません。 これを、値部分だけが違う場合は、1回だけprepareし、execute文で値を変えながら繰り返し実行する方法があり、この場合、値を入れる部分に「?」を入れておきます。 これは、クエスチョン・パラメタと呼ばれ、標準SQLでも規定されていると思います。 SQL文の文字列は、 select * from t1 where c1=? としておき、prepareし、実行時はexecute文で値を入れます。 select * from t1 where c1=? and c2=? などのように、複数を可変にすることも可能です。
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#2です。追記します。 ?パラメタはwhere句だけでなく、SQL中に変数が書ける場所で基本的には指定できます。 例えば、 update t1 set c2=? where c1=? などです。
- auty
- ベストアンサー率58% (284/486)
JavaでSQL文を実行するときに使われています。 例えば、 SELECT test01 FROM test WHERE test01 = 100; をJavaで実行しようとするとき、""で囲んで文字列のデータとして Statement クラス のメソッドに渡します。渡された時点では単なる文字列ですから SQLとして実行されるまでには、SQL文としてコンパイルされる必要があります。 特にこれが何回もループの中で繰り返されるようなことがあれば、 同じ回数コンパイルも繰り返されることになり大変な無駄となります。 そこで PreparedStatement クラス を準備して、このクラスに渡せば最初の1回のコンパイルで済むようにしています。 さて、? ですが、更にこの機能を高めるために実際の値は渡す時点でセットできるようにしています。つまり、 SELECT test01 FROM test WHERE test01 = ? を前もってコンパイルしておき、実行する直前に例えば、 ?に 100をセット すると言う具合です。 ? のことをプレースホルダとも言い、1つのSQL文に何箇所でも使えます。 実際の例が多くのページで紹介されていますので、 PreparedStatement 等で検索して、是非実行してみてください。
お礼
ありがとうございます。 無事理解できました。 また何かあればよろしくお願いします。