简单的SQL查询帮助

时间:2011-03-16 20:22:10

标签: sql stored-procedures

我正在为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,它一直在杀我。

3 个答案:

答案 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缓存自己的计划,它会更好,但基于参数,可能有这种方法可能需要也可能不需要......