如何在sql中添加多个条件?

时间:2015-12-16 04:33:44

标签: sql sql-server

这是我的存储过程:

ALTER PROCEDURE sp_searchedstudentrecords
(
@condition varchar(20),
@searchtext varchar(50),
@searchclass int


)
AS
begin
If (@condition = 'startswith')
select * from student where name like @searchtext+ '% '
else if (@condition = 'endswith')
select * from student where name like '%' +@searchtext
else
select * from student where name like '%' +@searchtext+ '%'
End

我已经添加了一个额外的文本框,用于按类查询以上查询。

@searchclass int

我现在应该按类查询搜索的内容是什么样的?

我是新的SQL查询和.net,

我已创建下拉列表包含startswith,endswith和contains以及一个用于按名称搜索的文本框。

我已经完成了按名称搜索的选择记录,我需要从表中选择按类搜索的记录。

有人可以指导我查询吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

喜欢这个

select * 
from student 
where name like (case 
                    when @condition = 'startswith' then  @searchtext+ '% ' 
                    else 
                        case when @condition = 'endswith' then '%' + @searchtext 
                             else '%' + @searchtext + '%' 
                        end 
                 end) 
 and studentid = isnull(@searchclass, studentid)

以上对studentid的查询已被额外搜索

如果任何id搜索传递值,则其他方式传递null 应该给出这个查询结果。

答案 1 :(得分:2)

如前所述,最好通过构建here所述的参数化查询在前端执行此操作。由于你不能使用LIKE参数化的保护功能,你必须小心sanitize your string(避免Sql注入)。

在.NET中实现时,最好避免字符串比较。您可以将过滤器定义为id->名称对的固定列表。

enum LikeFilterType
{
   Startswith = 1,
   Endswith = 2,
   Inside = 3
   // maybe exactly can be added later
}

IList<SelectListItem> FilterOptions = new List<SelectListItem>()
   {
      new SelectListItem() { Value = (int) LikeFilterType.Startswith, Text = "Starts with" },
      new SelectListItem() { Value = (int) LikeFilterType.Endswith , Text = "Ends with" },
      new SelectListItem() { Value = (int) LikeFilterType.Inside, Text = "Inside" }
   }

您的组合可以直接“绑定”到此列表并使用选定的值,而不是逻辑中的字符串(您显示的内容可能会随着时间的推移而改变,您不希望在更改显示的名称时更改逻辑!)

ASP.NET中的编码允许具有更易读和可维护的代码。

注意:请注意,用户应该知道或将受到LIKE special characters的影响。

答案 2 :(得分:0)

我假设您的参数可以为空,因此您可以这样做

SELECT * FROM student 
WHERE name LIKE ( CASE WHEN @condition = 'startswith' THEN @searchtext + '%'
                       WHEN @condition = 'endswith'   THEN '%'+@searchtext
                       ELSE '%'+@searchtext+'%'
                  END
                ) AND
      (@searchclass IS NULL OR studentClass = @searchclass)

@searchclass IS NULL是您检查参数的值,即使您的@searchclass为NULL也不会发生冲突

希望对你有所帮助。

答案 3 :(得分:0)

请参阅以下更新的存储过程和类过滤器。

根据确切的列名更改类列:

ALTER PROCEDURE sp_searchedstudentrecords
(
@condition varchar(20),
@searchtext varchar(50),
@searchclass int


)
AS
BEGIN
    IF (@condition = 'startswith')
        SELECT * FROM student WHERE  name like @searchtext+ '% ' AND Class = @searchclass
    ELSE IF (@condition = 'endswith')
        SELECT * FROM student WHERE  name like '%' +@searchtext  AND Class = @searchclass
    ELSE
        SELECT * FROM student WHERE name like '%' +@searchtext+ '%' AND Class = @searchclass
END