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

全件取得とWHERE指定のSQLを1つのDataAdapterで完結したい

投稿者投稿内容
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2004-06-10 17:43
こんにちは
個人マスタテーブルにユーザID,氏名が登録されているとします。
そこで以下のコード

sqlDA.SelectCommand.CommandText= "SELECT USERID,USERNAME FROM MASTER WHERE USERID = @USERID"
sqlCom.Parameters.Add("@USERID", SqlDbType.VarChar).Value = user
sqlDAUser.Fill()

として該当のユーザIDで抽出する場合と全ユーザを取得したい場合と2通りある場合には、WHERE以下がないSQLを別々に作るしかないのでしょうか?
パラメータの渡し方次第でひとつのSQLを使いまわす事は可能でしょうか?
よろしくお願いします。


[ メッセージ編集済み 編集者: だいまる 編集日時 2004-06-10 17:45 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-06-10 17:48
NAL-6295です。
引用:

sqlDA.SelectCommand.CommandText= "SELECT USERID,USERNAME FROM MASTER WHERE USERID = @USERID"





引用:

sqlDA.SelectCommand.CommandText= "SELECT USERID,USERNAME FROM MASTER WHERE @USERID IS NULL OR (USERID = @USERID)"



じゃ、駄目ですかね。
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2004-06-10 17:54
NAL-6295様

さっそくありがとうございます。
今クエリビルダ(VS.NET)を使ってユーザIDを指定した場合はOKはOKでしたが、
何も指定しない場合は1件も取得できませんでした。
それともクエリビルダでNULLを入れることができないから取得できてないのでしょうか?

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-11 08:31
 Oracleでの書式

SELECT * FROM TABLE1 WHERE NVL(COLUMN1, -1) = NVL(NVL(InputValue, COLUMN1), -1);


 NVL関数は、「第1引数がNULLの場合、第2引数を返す」関数です。該当するSQL Serverの関数を使用してください。
 よく見たら、「nullが入るかもしれないカラムを検索するとき」からコピーしてた。

 SQL Serverなら、こうかな?
SELECT USERID,USERNAME FROM MASTER WHERE USERID = ISNULL(@USERID, USERID);

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-06-11 08:38 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-06-11 09:57
引用:

だいまるさんの書き込み (2004-06-10 17:54) より:
NAL-6295様

さっそくありがとうございます。
今クエリビルダ(VS.NET)を使ってユーザIDを指定した場合はOKはOKでしたが、
何も指定しない場合は1件も取得できませんでした。
それともクエリビルダでNULLを入れることができないから取得できてないのでしょうか?




そうだと、思います。
一度、コーディングして確認してみてください。

#以前に、そういう実装をした事があるので多分、大丈夫だと・・・。
#NULLの時は、@USERID IS NULLがTRUEになり、(@USERID=USERID)がFALSEとなるが、
#ORで指定されているので全レコードTRUEとなり、全件取得できるはずという考えです。
#でも、Jittaさんの案の方が、モアベターですね。
#条件が複数あった時なんかは、特に。

#転記ミス修正
[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-06-11 10:01 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-06-11 12:55 ]
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2004-06-11 12:38
横槍質問で教えてください。
私はSQLServerは使ったことがないのですが、
(Oracle,Accessは有)

#NULLの時は、@USERID = NULLがTRUEになり、(@USERID=USERID)がFALSEとなる・・・

SQLServerのSQLでは、
NULL = NULL の論理演算がTrueになるんですか?

一応、今Oracleで実験してみると、NULL=NULLはFALSEです。

NULL = NULL の構文をTRUEと解釈してくれると、
SQLを動的にプログラム生成する場合は
非常に都合がよくて楽ですが(笑)

是非教えてください。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-06-11 12:49
platiniさん、こんにちは。

引用:

SQLServerのSQLでは、
NULL = NULL の論理演算がTrueになるんですか?


揚げ足を取っているつもりではないでしょうけど、元の投稿では
WHERE @USERID IS NULL OR (USERID = @USERID)
となっているので、単なる転記ミスじゃないですか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-06-11 12:55
引用:

きくちゃんさんの書き込み (2004-06-11 12:49) より:
platiniさん、こんにちは。

引用:

SQLServerのSQLでは、
NULL = NULL の論理演算がTrueになるんですか?


揚げ足を取っているつもりではないでしょうけど、元の投稿では
WHERE @USERID IS NULL OR (USERID = @USERID)
となっているので、単なる転記ミスじゃないですか?




NAL-6295です。

指摘の通り転記ミスです。
元の@USERID IS NULLが正解です。
というわけで、修正しておきます。

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