我有一个存储过程,它根据4个参数从表中获取信息。
我想根据参数获取值,但如果参数为NULL,则不检查该参数。因此,如果所有4个参数都为null,我将显示整个表。
这是我的SP(如您所见,这仅适用于1个参数atm):
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
END
END
有没有办法做到这一点没有每个可能的组合(15个IF)都有IF
?
答案 0 :(得分:36)
像
这样的东西SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE @Param1+'%'
OR @Param1 IS NULL
在这种特殊情况下你也可以使用
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE ISNULL(@Param1,'')+'%'
但总的来说,你可以试试像
这样的东西SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE (condition1 OR @Param1 IS NULL)
AND (condition2 OR @Param2 IS NULL)
AND (condition3 OR @Param3 IS NULL)
...
AND (conditionN OR @ParamN IS NULL)
答案 1 :(得分:3)
如果你的意思是@param1是col1的参数,@ param2是col2的参数,......等 你可以试试这个:
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
(case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
then ''
else
'where '+
(case when @Param1 is not null
then ' col1 like '''+@param1+'%'''+
(case when @param2 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param2 is not null
then ' col2 like '''+@param2+'%'''+
(case when @param3 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param3 is not null
then ' col3 like '''+@param3+'%'''+
(case when @param4 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param4 is not null
then ' col4 like '''+@param4+'%'''
else '' end)
end)
exec sp_sqlexec @query
答案 2 :(得分:2)
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
END
END
这应该有帮助
问候
Ashutosh Arya
答案 3 :(得分:1)
您可以在SQL Server中使用use COALESCE()
函数。您不需要在语句中使用IF- Else
或CASE
。以下是使用COALESCE
函数的方法。
SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)
SQL中的COALESCE
函数返回其参数中的第一个非NULL表达式。例如,如果@ param1等于null,则函数将返回col1,这将导致where语句中的col1 = col1,类似于1 = 1,这意味着条件将始终为真。
答案 4 :(得分:0)
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50) **= '',** //#1
@Param2 nvarchar(50) **= '',**
@Param3 nvarchar(50) **= '',**
@Param4 nvarchar(50) **= ''**
AS
BEGIN
**SET @Param1 = ISNULL(@Param1, '')** //#2
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
END
答案 5 :(得分:0)
这至少对我来说是有效的并且更容易理解。
IIF
语句仅在 SQL Server 2012 及更高版本中可用,您可以将其替换为case语句。
SELECT Id, col1, col2, ...
FROM myTable
WHERE condition1 = IIF(col1 IS NULL, col1, @Param1)
AND condition2 = IIF(col2 IS NULL, col2, @Param2)...
答案 6 :(得分:0)
Declare @criteria nvarchar (max)
SELECT col1,col2,col3
FROM table1
((col1+col2+col3 like '%'+@criteria+'%') OR ISNULL(@criteria, '') = '')
答案 7 :(得分:-1)
在CASE .. WHEN .. THEN..
的位置和使用位置添加条件
尝试以下方法。
select col1,col2,...colN..from Table
Where clm1 = CASE WHEN @PARAMETER = 0 THEN **COL1** ELSE **@PARAMETER**
一旦您将相同的列名设置为条件,然后从表中检索所有数据(如果要通过参数作为参数,然后根据表中的条件值进行检索)。