@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ADO.NETでのIN演算子について

投稿者投稿内容
ロバ
会議室デビュー日: 2005/03/28
投稿数: 7
投稿日時: 2005-03-28 22:51
皆さんはじめまして。
申し訳ありませんが質問させてください。

ADO.NETを使用していますが、IN演算子を使用したSQLで
問題があり、困っています。

SELECT * FROM A WHERE A.XXX IN (@PARAMETER)

このようなSQLを書いた場合、@PARAMETERには何をセットしたら
よいのでしょうか?
配列はダメなようですし、シングルクォートで囲いカンマで区切った文字列
(「'AAA','BBB'」のような形式)では単独の文字列として扱われているようです。
どなたかご教示をお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-29 00:22
単純にSQLの質問ですか?
IN ('AAA','BBB')
ということですか?あと、サブクエリもかけます。
ロバ
会議室デビュー日: 2005/03/28
投稿数: 7
投稿日時: 2005-03-29 01:32
説明が足りなくて申し訳ありません。
SQLというより、ADO.NETでの実装についてです。
実際は、

SqlCommand command = new SqlCommand(
"SELECT * FROM A WHERE A.XXX IN (@PARAMETER)");
command.Parameters.Add("@PARAMETER", "'AAA','BBB'") ; ←ここ
                                
この部分にセットするべきオブジェクトが何かわからないでいます。
上記のようにすると、どうも「'AAA','BBB'」という単独の文字列として
セットされているようで、想定された検索結果が得られません。
お知恵を貸していただけるとありがたいです。

書き忘れていましたが、DBはMSDEを使っています。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-29 02:11
引用:
上記のようにすると、どうも「'AAA','BBB'」という単独の文字列として
セットされているようで、想定された検索結果が得られません。

「想定された結果」がなんだかわかりませんが A.XXX が 'AAA' あるいは 'BBB' である
レコードを取得したいのではないのですか?
SELECT * FROM A WHERE A.XXX IN ('AAA','BBB')
じゃだめですかね?そもそもIN演算子にパラメータ使うことってあるのでしょうか?
(パラメータは詳しくないので力になれてないかも)
ロバ
会議室デビュー日: 2005/03/28
投稿数: 7
投稿日時: 2005-03-29 02:44
ご返答ありがとうございます。
想定された結果とは、A.XXXが'AAA'または'BBB'のレコードが取得されることですが、
私のコードでは検索結果はゼロ件でした。
OSQLから同じSQLを直接実行した場合は想定通りの検索結果が得られました。

最後の手段として直接SQL文字列を編集して実装するつもりですが

・SQLインジェクション対策をしたくない
・パラメータの使用、SQL文字列が固定であることを前提としたライブラリが
 既に実装されている(この件以外では有効に使えています)

この二つの理由で出来れば避けたいと思っています。
もっとも間に合わなくなれば贅沢を言ってはいられないのですが。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2005-03-29 06:05
記憶が不確かなのですが、

SqlCommand command = new SqlCommand(
  "SELECT * FROM A WHERE A.XXX IN (@PARAM1, @PARAM2)");
command.Parameters.Add("@PARAM1", "AAA") ;
command.Parameters.Add("@PARAM2", "BBB") ;

で動きませんか。
ロバ
会議室デビュー日: 2005/03/28
投稿数: 7
投稿日時: 2005-03-29 10:06
未確認ですが、ベーちゃん様のおっしゃるとおりのSQLで動くと思われます。
ただ、また説明不足で恐縮ですが、INの要素数は可変となります。
つまり、

'AAA','BBB','CCC'

ということがありえます。
このため複数の要素を一つのパラメータで指定する方法が無いかが問題となっていました。

時間が無いので(すでにスケジュールぎりぎりでして・・・)クエリ文字列を直接
切り貼りする方法で実装しようと思いますが、もしも良い方法をご存知でしたら
ご教示ください。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-29 10:12
普通に動的にSQL文とSQLパラメータを生成するだけの話だと思います。
ちなみにINのパラメータがユーザーに入力される値ならば、かならずパラメータを使用すべきです。

スキルアップ/キャリアアップ(JOB@IT)