在SQL中有条件地执行WHERE子句

时间:2010-07-29 15:08:59

标签: sql

我在SQL Server 2008数据库上有一个应用程序。此数据库具有查询其中一个表的存储过程。此存储过程采用两个参数:userName和ID

将始终传递userName参数。但是,ID字段将为NULL或实际值。如果值不是NULL,我需要在查询的WHERE子句中考虑它。不幸的是,我不肯定如何做到这一点。目前,我正在尝试

SELECT
  *
FROM
  TaskTicket t
WHERE
  t.[UserName]=@userName AND
  -- This is where I am stumped

感谢您的帮助!

7 个答案:

答案 0 :(得分:10)

SELECT
*
FROM
TaskTicket t
WHERE
 t.[UserName]=@userName 
 AND (@ID IS NULL OR t.[ID] = @ID)

答案 1 :(得分:3)

试试这个:

SELECT 
  * 
FROM 
  TaskTicket t 
WHERE 
  t.[UserName]=@userName AND 
  (@ID is null 
   or -- replace this comment with your logic
  )

答案 2 :(得分:3)

将条件组合在一起

select *
from TaskTicket t
Where t.[UserName]=@userName AND
  ((t.Id is null and (conditions_when_id_is_null))
   or
  (t.Id is not null and (conditions_when_id_is_not_null)))

答案 3 :(得分:2)

SELECT
    <column list>
FROM
    TaskTicket T
WHERE
    T.[UserName] = @username AND
    (T.id = @id OR @id IS NULL)

请注意,在某些情况下,这可能会导致非最佳查询计划。在这种情况下,这可能不是什么大问题,除非你的表很大并且你没有UserName和ID的索引。

答案 4 :(得分:1)

希望比使用OR条件更有效:

SELECT
  *
FROM
  TaskTicket t
WHERE
  t.[UserName]=@userName AND
  t.[ID] LIKE COALESCE(@ID,'%')

注意:仅当ID是非NULLable字符字段时才会起作用。 (你可以在t。[ID]上使用CAST和COALESCE,但是它不可能比OR条件更有效。)

或者,如果@ID为NULL,则在存储过程中使用动态SQL完全省略t。[ID]条件。

答案 5 :(得分:1)

declare @SQL nvarchar(max)
declare @WHERE_ID nvarchar(20)
set @WHERE_ID =
(
CASE 
   WHEN @ID is null THEN ''
   ELSE ' AND ID = ' + CAST(@ID as nvarchar(10))
END
)

set @SQL = 'SELECT * FROM TaskTicket WHERE UserName = ' + @userName + @WHERE_ID

EXEC @SQL

答案 6 :(得分:0)

Create procedure Procedure1
(    
 @Param1 nvarchar(100)=null,    
)    
AS      
BEGIN      
   SELECT    
   ColumnName1,ColumneName2
   FROM TableName
   WHERE    
   (@Param1 IS NULL OR ColumnName1=@Param1) 
END