我正在为MS SQL 05中的搜索构建查询
我有4件用户可以选择的东西,我想在其上使用AND逻辑。
但是当传入NULL时,我似乎无法使它工作。
这就是我所拥有的:
ALTER PROCEDURE [dbo].[sp_FindSource]
-- Add the parameters for the stored procedure here
@Code varchar(500),
@ssid varchar(50),
@serialNo varchar(50),
@category decimal(10,5)
as begin
SELECT *
FROM tblSource
WHERE Code IN (
SELECT Value
FROM funcListToTableInt(@Code,',')
)
and SSID LIKE '%' + @ssID + '%'
and serialNo LIKE '%' + @serialNo + '%'
and category = @category
end
注意:funcListToTableInt函数,解析传入的逗号seporated值(它自己工作,如果我把其他语句带出来的话)
以上搜索永远不会返回任何内容,如果它们以黑色传递并且仅查询其中包含某些内容的值,我该如何忽略它们? uuggh,它一直在杀我。
答案 0 :(得分:3)
您只需在WHERE条件周围包含一些OR @param IS NULL检查:
ALTER PROCEDURE [dbo].[sp_FindSource]
-- Add the parameters for the stored procedure here
@Code varchar(500),
@ssid varchar(50),
@serialNo varchar(50),
@category decimal(10,5)
as begin
SELECT *
FROM tblSource
WHERE (Code IN (SELECT Value FROM funcListToTableInt(@Code,',')) OR @Code IS NULL)
AND (SiteSourceID LIKE '%' + @ssID + '%' OR @ssID IS NULL)
AND (serialNo LIKE '%' + @serialNo + '%' OR @serialNo IS NULL)
AND (category = @category OR @category IS NULL)
end
乍一看这看起来很奇怪,因为它正在检查IS NULL的参数,但是它有效。
答案 1 :(得分:1)
尝试为空值添加OR子句。例如,将'和category = @category'更改为'和((category = @category)或(category为null)。)
对于您想要使用null imput的所有项目执行此操作,必须禁用该特定测试。
答案 2 :(得分:0)
有两种方法:
方式1,ADD OR Clause:它可以杀死性能......
SELECT *
FROM tblSource
WHERE (Code IN (
SELECT Value
FROM funcListToTableInt(@Code,',')
) OR @Code IS NULL)
and (SiteSourceID LIKE '%' + @ssID + '%' OR @SSID IS NULL)
and (serialNo LIKE '%' + @serialNo + '%' OR @serialNo IS NULL)
and (category = @category OR @category)
方式2:条件逻辑 考虑到你有4个参数,每个参数可能有值或者没有值,所以你有2 * 2 * 2 * 2,16种不同的情况。你可以这样写:
IF (@SSID IS NULL AND @Code IS NULL AND @serialNo IS NULL AND @category IS NOT NULL) THEN
-- SEARCH only of category
ELSE IF (@SSID IS NULL AND @Code IS NULL AND @serialNo IS NOT NULL AND @category IS NULL) THEN
-- SEARCH only on Serial Number
.
.
.
.
.
与在SQL Server中一样,每个If缓存自己的计划,它会更好,但基于参数,可能有这种方法可能需要也可能不需要......