我在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
感谢您的帮助!
答案 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