这是我的存储过程:
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以及一个用于按名称搜索的文本框。
我已经完成了按名称搜索的选择记录,我需要从表中选择按类搜索的记录。
有人可以指导我查询吗?
谢谢,
答案 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