1

我正在管理一个包含所有用于 DML 和 Selects 的 SQL 脚本的静态类。

但是,有一种情况是搜索可以采用多个搜索条件。

例如

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

当未提及容量或类型时,查询应返回所有项目,

Select items from table_items

这里有几个组合。

  1. 容量可以为空输入
  2. 类型可以为空输入
  3. 两者都可以是空输入

这是否意味着我的 SQL Script 静态类中必须有 3 个不同的 SQL 查询?并通过 case/if-else 验证上述每个组合?对我来说没有意义。特别是应用程序是使用数据访问、实体模型分别在三层架构中构建的。

也许我完全忘记了根源/基础。我不想编写动态 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

如果提交的值为空,则返回列的 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,则返回所有行。如果将值设置为 say 1,则仅返回该行。

于 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 回答