1

私のウェブサイトには 4 つの検索基準を備えた検索オプションがあり、検索するためにそれらすべてを入力する必要はありません。このロジックをデータ層、より具体的にはストアド プロシージャに実装したいと考えています。そのようなアプローチの 1 つは、

if ( all four are empty)
select command
else if ( 3 are empty
select command
and so on...

これらの IF ステートメントをより良いロジックに置き換えることができる他の方法はありますか。要するに、ユーザーが提供した値にのみ基づいて検索を行いたいのです

4

5 に答える 5

3

SQL Server 2008 以降を使用している場合、特定のサービス パックおよび修正プログラム レベルでパッチが適用されていないインストールがほとんどないことを除けば、このパターンで最高のパフォーマンスが得られます。

select ...
  from ...
 where (@criteria1 is null or column1 = @criteria1)
   and (@criteria2 is null or column2 = @criteria2)
       option (recompile)

このタイプの動的条件クエリの記述に関する最良のリファレンスは、Erland Sommarskog によるこちらです。

フロントエンドからクエリを動的に生成して、必要なフィルターのみを提示できる場合は、SQL Server 2005 のこのパターンよりも優れた結果が得られますが、動的 SQL が不可能な場合でも最適なオプションです。

于 2012-10-16T10:32:21.207 に答える
1

ユースケースロジックを使用できます。

SELECT 
   CASE 
      WHEN  all four are empty THEN expression
      WHEN 3 are empty THEN expression 
   END 
FROM ...

詳細はこちらをご覧ください:http: //msdn.microsoft.com/en-us/library/ms181765.aspx

于 2012-10-16T10:34:53.123 に答える
0

基本クエリを作成し、4 つの入力値に基づいて where 句に動的に追加します。

于 2012-10-16T10:32:58.643 に答える
0

私の経験では、この種の検索にはランキングも必要です。基準の 4 つが一致するレコードは、1 つが一致するレコードよりも重要です。

現在、データベースにアクセスできないため、以下の構文は少し壊れている可能性がありますが、原則として:

select ID, column1, column2, column3, column4, count(*) as rank
from 
(select ID, column1, column2, column3, column4
from searchtable
where column1 = @criteria1
union
select ID, column1, column2, column3, column4
from searchtable
where column2 = @criteria2
union
select ID, column1, column2, column3, column4
from searchtable
where column3 = @criteria3
union
select ID, column1, column2, column3, column4
from searchtable
where column4 = @criteria4)
group by select ID, column1, column2, column3, column4
order by rank desc
于 2012-10-16T10:42:52.663 に答える
0

次のようなものを探しているかもしれません

Create sp datasearch
(
@param1 datatype=null,
@param2 datatype=null,
@param3 datatype=null,
@param4 datatype=null
)
as

select * from table where 
col1=isnull(@param1 ,col1) and 
col2=isnull(@param2 ,col2) and 
col3=isnull(@param3 ,col3) and 
col4=isnull(@param4 ,col4) and 
于 2012-10-16T10:37:12.330 に答える