4

単純なクエリ、おそらく不可能ですが、私はそこにいくつかの賢い人々がいることを知っています:)

ブールパラメータが与えられた場合、特定の列の出力を制限するか、何もしないようにwhere句を定義したいと思います。

したがって、パラメータ@bit = 1が与えられると、これは結果になります。

ここで、column = 1

パラメータ@bit=0が与えられると、これは結果になります。

ここで、column=1または0

つまり、効果がない/すべての結果を表示する(列はビットフィールドです)

私は動的SQLを望んでいません-これをコードで修正することで解決できますが、上記をきちんとシンプルにする巧妙な魔法があるかどうか疑問に思いました。

ある?私はSQLサーバーを使用しています。

乾杯:D

4

8 に答える 8

8

column = 1 or @bit = 0列が0または1のみの場合 、答えは機能します。列が任意の値の場合: column = 1 or @bit = 0 and column = 0

于 2009-06-26T16:22:35.877 に答える
4
SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

にインデックスがある場合column1、これはより効率的です。

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

WHERE単一の条件とUNION ALL:のパフォーマンスの比較については、私のブログのこの記事を参照してください。

于 2009-06-26T16:20:50.663 に答える
3
where column BETWEEN @bit AND 1
于 2009-06-26T16:29:32.413 に答える
0
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
于 2009-06-26T16:21:24.177 に答える
0
select ...
from [table]
where @bit = 0 or (column = @bit)
于 2009-06-26T16:21:50.227 に答える
0

私は別の答えを思いついたので、コンセンサスの答えを見ると馬鹿になりました。それで、たわごとのために、私自身のデータベースを使用して2つを比較しました。それらが本当に比較可能かどうかはわかりませんが、実行計画は私の間抜けな答えにわずかな利点をもたらします。

Select *
from MyTable
where column <> case @bit when 1 then 0 else -1 end

インデックスやテーブルサイズなどがこれに影響を与える可能性があることを認識しています。
また、おそらく少しは-1と比較できないことに気づきました...
私が共有したいと思っただけです。

于 2009-06-26T16:40:15.897 に答える
0

これを試して

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

これは、列のデータ型に関係なく機能します(たとえば、文字列の場合もあります)。もちろん、それが別のデフォルト値である場合(0ではない)

于 2009-06-26T16:44:30.797 に答える
0

WHERE列>=@bit

ただし、これは数値列の0より大きい値に対してのみ機能します。@bitは、データ型が優先されるため、暗黙的にint、smallintなどにキャストされます。

于 2009-06-26T17:18:39.323 に答える