Mar*_*tin 36 sql-server null coalesce where-clause sql-server-2008
在WHERE子句中包含输入参数的最佳方法是什么,但如果它为null则将其排除?
我相信有很多方法,但我似乎无法记住.
我也可以使用COALESCE()?但我认为这仅适用于SELECTing值?
为了澄清,让我们说一个变量,@code ="1"然后我会在哪里,Where type='B' AND code = @code但如果@code is null那时我只想要Where type='B'- 注意缺失code = @code.
Kla*_*sen 68
你可以使用IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
Run Code Online (Sandbox Code Playgroud)
编辑:
您在评论中描述的内容可以像:
where (@code is null or code = @code)
Run Code Online (Sandbox Code Playgroud)
这是另一种方法
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
Run Code Online (Sandbox Code Playgroud)
如果参数为NULL,则不会计算OR表达式的其余部分.
怎么样
WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
Run Code Online (Sandbox Code Playgroud)
小智 5
我想提出一个在另一个网站上找到的解决方案:
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
Run Code Online (Sandbox Code Playgroud)
使用此解决方案,如果用户选择null您的参数,则您的查询将返回所有行作为结果。
小智 5
这个问题确实帮助我解决了一个类似的问题,这个问题让我们中的一些人摸不着头脑。我只写它以防其他人尝试相同的方法并且无法弄清楚为什么它不起作用。
如果@Parameter 不为空,我试图只评估多部分 WHERE 子句的一部分。我尝试按如下方式执行此操作,但如果@Parameter 为空,则始终没有返回任何行。
DECLARE @Parameter int = null;
SELECT * FROM TABLE
WHERE [AlternateID] is not null
AND (@Parameter is not null AND [AlternateID] = @Parameter)
Run Code Online (Sandbox Code Playgroud)
我错误地认为(@Parameter is not null AND [AlternateID] = @Parameter)@Parameter 为空不会构成完整WHERE 子句的一部分。然而,它使整个 WHERE 子句返回 false。补救措施是添加 OR 1=1 如下:
WHERE [AlternateID] is not null
AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
Run Code Online (Sandbox Code Playgroud)
当然,Ali 概述的方法(没有足够的声誉来投票)更有效地解决了这个问题。
WHERE [AlternateID] is not null
AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])
Run Code Online (Sandbox Code Playgroud)