SQL Server哪个字段为null或不为null或两者都是?

时间:2014-02-28 09:26:33

标签: asp.net sql-server stored-procedures checkbox parameter-passing

我的sql语句问题非常烦人。我正在使用存储过程(必须),我不能使用动态SQL。

假设我有这张表:

PEOPOLE

ID NAME     SURNAME  MARRIED  COMPANY  PAYMENTID
---------------------------------------------------   
1  Michael  Backer      1     Google    1
2  Travis   Morgan      null  null    null 
3  George   Marshall    null  null    null
4  Trevor   Rush        1     Microsoft  1
5  John     Doe         1     IBM        2

我的ASP.NET(C#)站点上有两个复选框。首先是“已婚”,第二个是“未婚”。

如果用户仅检查第一个checbox结果是id为1和4的行,如果选中第二个checbox,则结果为id为2和3的行。如果检查了两个checbox,则结果为整个表(id为1- 4)。请记住,我有一个serach框,检查一些人姓,姓氏,所以这也是在sql语句。

如何通过存储过程设法完成我想要的操作,因为我无法传递'IS NOT NULL'或'IS NULL'之类的值。有什么建议吗?

搜索示例:

用户可以选择在哪个公司和付款中包含(始终至少其中一个),以便在搜索和检查checbox中查看婚姻状况。我将公司和付款参数传递给存储过程并在IN语句中使用它。

  1. 示例(最复杂的): 用户包括Google和Microosft以及所有paymentid-s搜索。如果两个婚姻checbox都是checekd(第一个和第二个),那么结果是ID为1,3的人,并且因为第二个checxbox也被检查2和3(公司是空值)。

  2. 示例:用户包括所有公司和所有paymentid-s,并仅检查第二个checbox,其中显示“未结婚”。因此,结果是ID为2和3的人。在这种情况下,您可以看到公司和paymentid-s并不重要,因为空值(可能的连接语句?)

  3. 示例:用户包括所有公司和paymentid-s(或不包括),并且只为已结婚的人(第一个复选框)提供服务,因此结果是已婚人士和在选定公司工作的人员。

  4. 用户可以在每个场景中搜索姓名,姓氏等。

    我的sql:

    WHERE
      (
        (@MarriageCheck IS NULL) or
        (@MarriageCheck = 0 AND Marriage IS NULL) or
        (@MarriageCheck = 1 AND Marriage IS NOT NULL)
      ) and
      (
       people.company in ('Google') AND  // google is parameter @companies 
       people.payment in ('1','2') AND // payment is parameter @payment (splited by , using xml)
       people.name LIKE %Mic% AND
       people.surname LIKE %bac%
    ...
      )
    

    仅供参考,因为并不重要:我解决了使用xml拆分传递IN参数(它有效)。

2 个答案:

答案 0 :(得分:1)

从前端使用DBNull.Value

示例:假设我有一个类,对象是AgeItem,其属性为AgeIndex我可以检查空值,如下所示。

Parameter.Value = (object)AgeItem.AgeIndex ?? DBNull.Value;

在您的数据库中检查参数中的空值。

编辑1

//check what you have to send value of null
//if null then pass BDNull.Value
//else the value
cmd.Parameters.Add("@marriedcheck", SqlDbType.NVarChar).Value=?;

答案 1 :(得分:1)

我会将WHERE子句写成:

WHERE (@MarriageCheck IS NULL) or
      (@MarriageCheck = 0 AND Marriage IS NULL) or
      (@MarriageCheck = 1 AND Marriage IS NOT NULL)

其中@MarriageCheckbit类型的新参数。在C#代码中正确设置该值应该是一个简单的条件逻辑:

cmd.Parameters.Add("@MarriageCheck",SqlDbType.Bit)
if(!(chkFirst.Checked&&chkSecond.Checked))
{
   cmd.Parameters["@MarriageCheck"].Value = !chkSecond.Checked;
}
else
{
   cmd.Parameters["@MarriageCheck"].Value = DBNull.Value;
}

(更新为“不”既被视为与选中第一个复选框一样)


通常,如果您还想进行其他形式的检查(例如company),我会将WHERE条款安排为:

WHERE
  (
    (@MarriageCheck IS NULL) or
    (@MarriageCheck = 0 AND Marriage IS NULL) or
    (@MarriageCheck = 1 AND Marriage IS NOT NULL)
  ) and
  (
    --Company conditions go in here
  )