2012-01-20 16 views
2

SQL SELECT文のチェック条件

私は

IF EXISTS(SELECT ID, NAME FROM TABLE WHERE [email protected]) 
    SELECT ID, NAME FROM TABLE WHERE [email protected] 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 

ようsomwthingを使用しますが、私が最初に使用し、この方法は二回(一回のチェックにし、実際の戻りレコードセット一度選択します。

+0

IDは「TABLE」の行を一意に識別しますか? 'ELSE'条件は同じテーブルから選択していますか?そうなら、常に0と評価されますか? –

答えて

2

それはあなたのように非効率的ではありませんEXISTSキーワードは、1レコードが見つかった後にオプティマイザが停止することを意味します。

しかし、繰り返しを避けたい場合は、

SELECT ID, NAME FROM TABLE WHERE [email protected] 

IF (@@rowcount = 0) 
    SELECT QTY FROM TABLE WHERE [email protected] 

ここでの問題は、最大2つのレコードセットをクライアントに返すことです。そのうちの最初のものは空です(ただし、フィールドヘッダーなどは、0レコードだけで返されます)

結果がテーブル変数に挿入され、レコードがあればクライアントに返すことで回避できます。しかし、私はあなたがすでにしているように、単にEXISTS()を使用するよりも著しく遅くなると思います。

+0

2つの結果セットの形状は、とにかく異なるので、それらを一緒に強くしようとするポイントはありません。私はまったく同じことを投稿しようとしていました。 –

+0

私は同意しません: 'EXISTS'は、オプティマイザに、「1レコードが見つかった後に停止する」ことを指定しません。(空のセットを指定すると明らかに不可能です) – onedaywhen

+0

@onedaywhen - すべてのSQLは式です実際に実行される抽象レベルよりも高いレベルの抽象レベルで論理を処理する。 EXISTS()は、 '0レコードの構文はfalseに等しい、それ以上は真に等しい'です。SQL Serverのオプティマイザは、EXISTS()操作の一部として結果を提供するときにレコードが見つかった場合に実行を終了するのに十分効率的です。要するに、あなたの不同意に同意しません;) – MatBailie

2
DECLARE @ID INT, 
     @NAME VARCHAR(50); 

SELECT @ID = ID, 
     @NAME = NAME 
FROM TABLE WHERE [email protected]; 

IF(@@ROWCOUNT = 1) 
    SELECT @ID AS ID, @NAME AS NAME 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 
+0

最初の選択が最大で1つの行を返すことが保証されていますが、現時点では書かれているようには機能しません。 'Name'も変数に代入する必要があります。次に、変数を選択するか、または他の選択を行うための条件付きロジックがあります。また、これはMySQLの構文です... –

+0

MySQLについて:BUSTED! (しかし私はこれを普遍的と想定していました)文法を自由に編集してください。ワークフローについて:最初のクエリで行が返されない場合は、2番目のクエリが返されます。 Oups! IF –

+0

のs/<>/=私はSQL Serverで動作するよう編集しました。私があなたの意図を変えたら、もちろんそれを巻き戻してください。 –