存储过程WHERE子句

时间:2014-03-28 19:57:58

标签: sql-server stored-procedures

我的存储过程遇到了一些问题。它要求我以三种不同的方式搜索患者,PatientIDLastNameMedicareNum。出于某种原因,我可以按MedicareNum搜索,但无法使用其他两个进行搜索。

到目前为止,这是我的代码:

ALTER PROCEDURE SearchByMedi
(
    @MedicareNum nchar (10),
    @LastName varchar(50),
    @PatientID nchar(10)
)
as
Begin
    SELECT * from Patient
    WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
      AND LastName = @LastName OR @LastName IS NULL
      AND PatientID = @PatientID OR @PatientID IS NULL
End

提前感谢您的任何反馈,非常感谢!

编辑:很抱歉花了这么长时间才发布到目前为止我所做的事情。我试过了:     更改程序SearchByMedi     @MedicareNum nchar(10),     @LastName varchar(50),     @PatientID nchar(10)     如     开始     SET NOCOUNT ON;

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
         + CASE WHEN @MedicareNum=''
                THEN N' AND MedicareNum = @MedicareNum'
                ELSE N' ' END
         + CASE WHEN @LastName=''
                THEN N' AND  LastName = @LastName'
                ELSE N' ' END
         + CASE WHEN @PatientID=''
                THEN N' AND PatientID = @PatientID '
                ELSE N'' END

EXECUTE sp_executesql @Sql
                 ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                 ,@MedicareNum
                 ,@LastName 
                 ,@PatientID

END

我也尝试过,当@MedicareNum =''时,我使用了你的解决方案(IS NOT NULL)并且它不起作用。我也尝试过:     开始

Select * from Patient
WHERE (@MedicareNum=MedicareNum or @MedicareNum='')
AND (@LastName=LastName or @LastName='')
AND (@PatientID=PatientID or @PatientID='')

End

^此代码返回数据,正确的MedicareNum数据,但LastName和PatientID搜索的数据不正确。

4 个答案:

答案 0 :(得分:0)

试试这个:

ALTER PROCEDURE SearchByMedi
(
@MedicareNum nchar (10),
@LastName varchar(50),
@PatientID nchar(10)
)
as
Begin

SELECT * from Patient
WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL )

End

答案 1 :(得分:0)

你错过了复杂条件下的括号:

SELECT * from Patient
WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL)

IMO,更好的是:

SELECT * from Patient
WHERE MedicareNum = ISNULL(@MedicareNum, MedicareNum )
AND LastName = ISNULL(@LastName, LastName )
AND PatientID = ISNULL(@PatientID, PatientID )

答案 2 :(得分:0)

您需要将where子句的不同情况包装在一起。你的OR和AND一起运行。

ALTER PROCEDURE SearchByMedi
(
@MedicareNum nchar (10),
@LastName varchar(50),
@PatientID nchar(10)
)
as
Begin

SELECT * from Patient
WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL)

End

这样,您将获得MedicareNum = var或null,然后LastName = var或null 您原来的方式是一起检查所有三个值而不是每天检查

答案 3 :(得分:0)

尝试这种方法,它更具有性能效率,然后必须添加其他答案中显示的子句。

CREATE PROCEDURE SearchByMedi
@MedicareNum nchar (10),
@LastName    varchar(50),
@PatientID   nchar(10)
AS
BEGIN
 SET NOCOUNT ON;

  DECLARE @Sql NVARCHAR(MAX);

  SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
             + CASE WHEN @MedicareNum IS NOT NULL
                    THEN N' AND MedicareNum = @MedicareNum'
                    ELSE N' ' END
             + CASE WHEN @LastName IS NOT NULL
                    THEN N' AND  LastName = @LastName'
                    ELSE N' ' END
             + CASE WHEN @PatientID IS NOT NULL
                    THEN N' AND PatientID = @PatientID '
                    ELSE N'' END

EXECUTE sp_executesql @Sql
                     ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                     ,@MedicareNum
                     ,@LastName 
                     ,@PatientID

END