如何用动态where子句编写SQL语句?

时间:2015-06-25 22:23:36

标签: sql stored-procedures where nullable

我有一个存储过程需要根据用户输入返回行。在参数上可以有3个不同的值。该值由用户从提示中提供,可以是' A' B' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' AB' B.

这是测试查询:

declare @prefix char(10) = 'Region'
declare @region char(2) = '90'
declare @year int = 2015
declare @month int = 03
declare @day int = 01
declare @option char(1) = null -- default, can be 'A', 'B', or both.

select
  t1.ControlNumber, 
  t1.CustomerName,
  t1.CustomerStatement
  case
    when    sr.ControlNUmber is not null
    then    rtrim(ltrim(@prefix))
            + @region+ '\' + 'Folder1\'     
    else    rtrim(ltrim(@prefix)) + 
            + @region+ '\' + 'Folder2\'
    end as Location
  from Table1 t1
  inner join Table2 t2 ON t1.CustomerStatement = t2.CustomerStatement 
  left join tblControl c on t1.ControlNumber = c.ControlNumber 
  where (s.StatementOption = @sOption)
  and s.FileYear = @FILEYEAR
  and s.FileMonth = @FILEMONTH
  and s.FileDay = @FILEDAY
  and s.BackendType = 1
  and s.Region = @REGION 

我正在寻找编写where条款的方式,以便能够测试3个选项中的一个(' A',' B'或' AB')

在我的c#代码中,我将@option参数发送为nullable

SqlParameter sOption = command.Parameters.Add("@sOption", SqlDbType.Char);
sOption.Direction = ParameterDirection.Input;
sOption.Value = (object)option ?? DBNull.Value;

因此,如果用户输入' AB'选项默认为null:

switch (option)
{
   case "E":
     option = "S";
     break;
   case "P":
     option = "N";
     break;
   default:
     option = null;
     break;
}

意味着用户想要获得具有两种选项的记录。

最好的成就是什么。

我希望我明确提出问题

0 个答案:

没有答案