- PR -

SQL Server:DbCommandパラメータの設定による条件分岐

1
投稿者投稿内容
ひづる
会議室デビュー日: 2007/08/18
投稿数: 6
投稿日時: 2007-08-26 10:28
以下の実現方法で悩んでいます。

===============================================
DbCommandでパラメータ@A,@B,@Cを設定、
sql文をコードから呼び出します。

データ検索としては以下を実現する方向となっています。
-----------------------------------------------
select 列1,列2 from テーブル1
where(
(テーブル1.列3= 'aaa'
 AND テーブル1.列4 = @A) ・・・条件1
 AND テーブル1.列5 = @B) ・・・条件2
OR
(テーブル1.列3= 'bbb'
 AND テーブル1.列6 = @C) ・・・条件3
)
-----------------------------------------------
(※テーブルの全てのカラムはnull許可しないものとなっています)

■実現したいこと
@A・@B・@Cのいずれかが' '(ブランク)である場合、
該当する各条件文を除いて検索するSQL文を
思考錯誤しています。

例1:@Bがブランクの場合
 where(
(テーブル1.列3= 'aaa'
 AND テーブル1.列4 = @A)
OR
(テーブル1.列3= 'bbb'
 AND テーブル1.列6 = @C)
)


例2:@A・@Bがブランクの場合
 where(
(テーブル1.列3= 'bbb'
 AND テーブル1.列6 = @C)
)
===============================================

SQL(DB処理)も始めて間もなく、検討そのものも苦戦しています。
何かよい方法は無いでしょうか。

宜しくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-08-26 17:55
CASE WHENで検索しる。
_________________
質問する前にググレカス
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-08-26 19:23
NAL-6295です。

(@a is null or @a = '' or 列4 = @a)

といった感じにするとよいと思いますが、
クエリを組み立てる段階で排除できるなら
その方がよいと思います。
ひづる
会議室デビュー日: 2007/08/18
投稿数: 6
投稿日時: 2007-08-26 22:46
返信ありがとうございます。

ぶさいくろうさん
case・whenでは検討してみました。
でもいい組み立てが見つからなくて困っていたんです。

NAL-6295さん
>(@a is null or @a = '' or 列4 = @a)
>といった感じにするとよいと思いますが、
>クエリを組み立てる段階で排除できるなら
>その方がよいと思います。

ありがとうございます。
回答を参考に再検討します。
ひづる
会議室デビュー日: 2007/08/18
投稿数: 6
投稿日時: 2007-08-26 23:44
>ぶさいくろうさん

回答頂いたこともあり、追記させて下さい。
case whenで調べて、以下を考えたのですが。。。
-------------------------------------------------
where(
(テーブル1.列3= 'aaa'
 AND
(CASE WHEN @A <> ' ' THEN テーブル1.列4 = @A
ELSE テーブル1.列4 <> NULL
END)
 AND
(CASE WHEN @B <> ' ' THEN テーブル1.列5 = @B
ELSE テーブル1.列5 <> NULL
END)
)OR
(テーブル1.列3= 'bbb'
 AND
(CASE WHEN @C <> ' ' THEN テーブル1.列6 = @C
ELSE テーブル1.列6 <> NULL
END)
)
-------------------------------------------------
上記だと、
テーブル1.列3= 'aaa' かつ@A <> ' 'のとき、
テーブル1.列4の値が@Aとなり、
実現したいことでないと、方法を再検討という状況です。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-08-27 01:01
CASE WHENはネストできるけどね。
何で実現できないんだろ。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-27 07:34
空白文字と空文字列は違う
nullは比較できない

ってことでは?
_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-27 18:06
引用:
where(
(テーブル1.列3= 'aaa'
 AND
(CASE WHEN @A <> ' ' THEN テーブル1.列4 = @A
ELSE テーブル1.列4 <> NULL
END)
 AND
(CASE WHEN @B <> ' ' THEN テーブル1.列5 = @B
ELSE テーブル1.列5 <> NULL
END)
)OR
(テーブル1.列3= 'bbb'
 AND
(CASE WHEN @C <> ' ' THEN テーブル1.列6 = @C
ELSE テーブル1.列6 <> NULL
END)
)

何のDBか書いてませんがSqlServerだとしたらまず、「THEN テーブル1.列6 = @C」とかっておかしくないですか?
1

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