- PR -

動的に条件を設定する方法

1
投稿者投稿内容
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-12-16 19:39
お世話になっております。

ただいまSQL ServerでSPを作成しています。
その中でカーソルを使ってデータを取得する処理があるのでが、
カーソルの中の条件の変数がNULLか空文字だった場合は、条件から
はずしたいのですができません↓

DECLARE TOGETU_CUR CURSOR
LOCAL FAST_FORWARD READ_ONLY FOR
 SELECT A FROM DATATABLE WHRER B=@B AND C=@C

※「@C」がNULLか空文字の場合は「AND C=@C」を条件からはずしたい

すみませんが、どなたかご教授の程よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-12-17 00:07
コード:
C=@C -> ( @C IS NULL OR C=@C )


で、どうですか?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-12-17 00:46
コード:
C = CASE WHEN @C IS NULL THEN C ELSE @C END 


という手もあります。

で、あしゅさんのと、上記例とどっちがいいんだろう?って疑問を持ち
対象列(C)にNON UNIEQUEのCLUSTERED INDEXがある場合・ない場合で
実行計画を見てみたところ、
INDEXなしはどちらもコストに差がなく、
INDEXありは上記例の方がコストは低くなりました。
#ただしデータ種類4パターンで、1万行程度でしか測定していない・・・。

何かの参考になれば幸いです。
_________________
夏椰 @ わんくま同盟
夏椰の庵
Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 )
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-12-17 02:35
夏椰さん、あしゅさん返信ありがとうございます。

コード:
--------------------------------------------------------------------------------

C = CASE WHEN @C IS NULL THEN C ELSE @C END

--------------------------------------------------------------------------------
理解しました。こんなやり方が・・・。空文字の条件を加えるなら
WHEN @C = '' THEN C を加えればいんですね。 非常に助かりました。

コード:
--------------------------------------------------------------------------------

C=@C -> ( @C IS NULL OR C=@C )

--------------------------------------------------------------------------------

これはどういう構文になっているのでしょうか。
初心者ですいません。


あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-12-18 10:44
引用:

我利さんの書き込み (2006-12-17 02:35) より:
これはどういう構文になっているのでしょうか。
初心者ですいません。



@CがNULLの場合はORの左辺が真になるので短絡評価されて
右辺は無視される事になるので、OR全体が真と評価されます。
C=@Cは、@Cが非NULLの場合のみ評価されることになるわけです。

あと、ORはANDよりも優先順位が低いので括弧でくくる必要があります。

CASEと比べたメリットは、式が短くて済むくらいですかね。

[追記]
もしかして、構文って「C=@C ->」の事ですか?
単に「C=@C」を「( @C IS NULL OR C=@C )」に変えてって意味です。
[/追記]

[ メッセージ編集済み 編集者: あしゅ 編集日時 2006-12-18 10:47 ]
1

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