1

DML および Select 用のすべての SQL スクリプトを使用して静的クラスを管理しています。

ただし、検索で複数の検索条件を使用できるシナリオがあります。

例えば

Select items from table_items where capacity = 10 and type = 'metal'

容量またはタイプが言及されていない場合、クエリはすべての項目を返す必要があります。

Select items from table_items

ここにはいくつかの組み合わせがあります。

  1. 容量は空の入力にすることができます
  2. タイプは空の入力にすることができます
  3. どちらも空の入力にすることができます

SQL スクリプトの静的クラスに 3 つの異なる SQL クエリが必要ということですか? 上記の各組み合わせを case/if-else で検証しますか? 私には意味がありません。特に、アプリケーションがデータ アクセス、エンティティ モデルを使用して 3 層アーキテクチャで個別に構築されていること。

おそらく、私はルーツ/基本を完全に忘れています。動的 SQL クエリを書きたくありません。

このシナリオの適切な回避策は何ですか?

編集:元のクエリ

    public static readonly string SqlGetItemsBy_ID_Capacity_Type = "SELECT TT.[ID], " +
    "TT.[CAPACITY], " +
    "TT.[TYPE], " +                  
    //some code here
                        "FROM [ITEMS]  AS TT " +                    
                        "WHERE //some code here +
    "AND TT.[CAPACITY] = CASE WHEN 0 = @Capacity" + //+ numCapacitySearch.Value +
                        "THEN TT.[CAPACITY] ELSE @Capacity END " + //+ numCapacitySearch.Value +
    "AND TT.[TYPE] = CASE WHEN ??? IS NULL THEN TT.[TYPE] ELSE @Type END" ;

???NULLと比較する場合の参照...

4

2 に答える 2

2

送信された値が null の場合に列が返される case ステートメントは、このようなすべての行を提供します。

Select 
  items 
from 
  table_items 
where 1=1 
  and capacity = case when @capvalue is null then capacity else @capvalue end 
  and type = case when @typevalue is null then type else @typevalue end 

フィドル

値を null に設定すると、すべての行が返されることに注意してください。値を say1に設定すると、その行のみが返されます。

于 2014-06-25T05:25:48.720 に答える
0

クエリで次のようにすることができます。

Select items 
from table_items 
where (capacity <> null or capacity = 10) 
       AND 
      (type <> null or type = 'metal') 

または、いくつかのプログラムでプログラム的に行うこともできますif elses

また、エンティティ フレームワークのような ORM を使用している場合。動的クエリがあり、通常はクエリを段階的に「構築」できます。

于 2014-06-25T05:25:39.067 に答える