我正在尝试进行以下操作的查询:我的Items数据库中有列,这些列称为Title,AuthorName和ItemType。我想在我的查询中执行以下操作:用户输入AuthorName,Title并从下拉列表中选择ItemType。用户可以将AuthorName或Title框留空。即使他例如没有填写AuthorName部分,如果找到具有指定ItemType的项目并且指定了Title我在结果中显示它。类似地,Title可以留空,在这种情况下,具有指定AuthorName的项目列在结果列表中。这是我的疑问:
SELECT *
FROM [Items]
WHERE ( ( ( [Title] LIKE '%' + @Title + '%' )
AND ( [ItemType] = @ItemType )
)
OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' )
AND ( [ItemType] = @ItemType )
)
)
但是当AuthorName或Title留空时,找不到任何结果。有人可以帮忙吗?
由于
答案 0 :(得分:2)
Select ...
From Items
Where ( @Title Is Null Or Title Like '%' + @Title + '%' )
And ( @AuthorName Is Null Or AuthorName Like '%' + @AuthorName + '%' )
And ItemType = @ItemType
在ASP.NET中,您应该针对string.IsNullOrEmpty
检查表单值,如果为true,则将DBNull.Value
发送到参数化查询而不是空字符串。
如果你坚持为参数传递一个空字符串(这不是首选),那么查询需要检查空字符串:
Select ...
From Items
Where ( Len(@Title) = 0 Or Title Like '%' + @Title + '%' )
And ( Len(@AuthorName) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
And ItemType = @ItemType
在SQL Server中,Len
函数将忽略空格。如果你真的想发疯并在查询中进行所有检查(同样不推荐),那么你会想要将你的参数作为空字符串,所有空格或空值来说明:
Select ...
From Items
Where ( Len(Coalesce(@Title,'')) = 0 Or Title Like '%' + @Title + '%' )
And ( Len(Coalesce(@AuthorName,'')) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
And ItemType = @ItemType
答案 1 :(得分:1)
尝试这样的事情:
SELECT *
FROM [Items]
WHERE ([ItemType] = @ItemType)
AND ([Title] LIKE '%' + @Title + '%' OR @Title IS NULL)
AND ([AuthorName] LIKE '%' + @AuthorName + '%' OR @AuthorName IS NULL)
当NULL
或AuthorName
为空时,请确保传入Title
值(System.DBNull.Value)。
<强>更新强>:
假设AuthorName
和Title
在“未选中”时作为空字符串传递给您的代码隐藏,您可以执行以下操作(其中authorName
和{{1}字符串传递给你的代码隐藏了:
VB:
title
C#:
cmd.Parameters.Add("AuthorName", SqlDbType.VarChar, 50).Value = IIf(authorName.length > 0, authorName, System.DBNull.Value)
cmd.Parameters.Add("Title", SqlDbType.VarChar, 50).Value = IIf(title.length > 0, title, System.DBNull.Value)
答案 2 :(得分:1)
我在code.scottshipp.com的代码博客中写了一篇关于此内容的完整教程。可以完整下载该教程中的代码。它显示了如何将其设置为存储过程,但也详细介绍了如何在查询中构造where子句。所以它涵盖了两个实例。您可能更容易进入存储过程路线,因此您可能想要读取它。
要记住的是,有各种方法可以做到这一点,但有一些“问题”也会使你的代码在某些情况下工作,而不是其他人,如果你使用类似ISNULL函数的东西。
相反,一般来说,我会建议如下:
将以下代码段添加到您希望有时为空白的where子句的任何部分:
OR SomeParam IS NULL
此外,将括号括在整个事物中是可读的。对于您认为某些参数可能为空的每个参数执行此操作。这意味着,例如,您的select语句将变为:
SELECT *
FROM [Items]
WHERE ( ( ( [Title] LIKE '%' + @Title + '%' OR [Title] IS NULL )
AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
)
OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' OR [AuthorName] IS NULL)
AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
)
)
答案 3 :(得分:1)
请试试这个
SELECT *
FROM [Items]
WHERE ( ( ( [Title] LIKE CASE WHEN ISNULL(@Title,'')='' THEN [Title] ELSE '%' + @Title + '%' END )
AND ( [ItemType] = @ItemType )
)
OR ( ( [AuthorName] LIKE CASE ISNULL(@AuthorName,'')='' THEN [AuthorName] ELSE '%' + @AuthorName + '%' END)
AND ( [ItemType] = @ItemType )
)
)
这会有所帮助。即使您没有通过Title或Authorname,这也会运行。