2012-01-15 10 views
1

表:私はこれを持っているUIで"where"句をベクトルでエレガントにする方法は?

name | isActive  //(bit - not nullable) 
___________________ 
a   1 
b   1 
c   0 
d   0 
...  ... 

enter image description here

彼はそのベクトルを作成するだけActive onesNon Active onesNothing

イムをwantd場合、ユーザが選択することができます次のいずれかの値を持つことができます:'11,10,01,00'

10 =私にアクティブを与え、私を与えるいけない - 非活性物質

01 =は私に非アクティブを与え、私を与えるいけない -

...活性物質

11は私の両方を与えます00何も...

これがスタートです。

が、イム私のクエリでwhere句の最もエレガント方法を探して:

私の撮影:

select ... 
WHERE isActive = CASE WHEN LEFT(@vector, 1) = RIGHT(@vector, 1) 
     AND RIGHT(@vector, 1) = '1' THEN isActive 
     ELSE 
      ... (more option calculations (bad and long and non elegant ...) 

      END 

任意のエレガントな助け?

+0

単純な 'WHERE active = 1(または0)'の何が問題なのですか? –

+0

@ Lieven時にはポーポールは1,2, –

+0

のレポートを望んでいる私はおそらくまだ全体の画像を見ていないだろうが、その場合は、あなたはちょうどwhere句をすべて排除するだろうか? –

答えて

0

00 - NOTHINGとはどういう意味ですか?実際には、クエリを実行する必要はありません。
あなたはこの試みることができます:あなたは、あなたがNULLを通過しないときに、@isActive1または0を渡すisActive気にすると

... 
WHERE [email protected] OR @isActive IS NULL 

を。

ただし、このクエリではisActiveを超えるインデックスは使用されません。

+0

私が合格すれば私は知らない。私はSQLにc#からどのようなベクトルを渡します。すなわち、10/01の場合、クエリは正常です。しかし1/1の場合はそうではありません。 –

+0

唯一の状況は0/0なので、実行する必要はありません。その通り。 1/1はどうですか? ImはNULLを渡しません11 –

+0

@RoyiNamir '@ isActive'を' bit 'として使うようにアプリケーションのロジックを変更することはできますが、できない場合は 'NULLIF(@ isActive、' 1/1 ')'関数。 –

関連する問題