Sql server Where子句按变量带或不带数据

Sql server Where子句按变量带或不带数据,sql-server,Sql Server,如何从结果中包括或排除数据 我有一个在一行中有许多值的表。我想显示所有值“end”或所有不带“end”的值。我的开关“@end”也有一个变量 如果它的值为“310”,则程序应向我显示带有“end”的所有内容。如果它有另一个值,则程序应显示所有值,不带“结束” 我试过这样的方法: where CASE @END WHEN 310 THEN m.LONR = @ENDE ELSE m.LONR <> 310 END 其中CASE@END WHEN 310然后m.LONR=@ENDE E

如何从结果中包括或排除数据

我有一个在一行中有许多值的表。我想显示所有值“end”或所有不带“end”的值。我的开关“@end”也有一个变量

如果它的值为“310”,则程序应向我显示带有“end”的所有内容。如果它有另一个值,则程序应显示所有值,不带“结束”

我试过这样的方法:

where CASE @END WHEN 310 THEN m.LONR = @ENDE ELSE m.LONR <> 310 END
其中CASE@END WHEN 310然后m.LONR=@ENDE ELSE m.LONR 310 END
在带有case的where子句中,运算符似乎是不可能的

我在这里没有找到任何等价的答案,或者我不明白


谢谢jens,您可以使用
来代替大小写表达式:

WHERE   (@End = 310 AND m.LONR = 310)
OR      (@End <> 310 AND m.LONR <> 310)
如果将
m.LONR
编入索引,则使用
If
将案例拆分几乎肯定是有益的:

IF (@End = 310)
BEGIN
    SELECT  <columns>
    FROM    <tables>
    WHERE   m.LONR = 310;
END
ELSE
BEGIN
    SELECT  <columns>
    FROM    <tables>
    WHERE   m.LONR <> 310;
END
原因是SQL Server将根据未知的
@End
创建一个计划,因此在编译时不知道它是否将通过以下方式进行过滤:

m.LONR = 310

m.LONR 310

因此,它无法有效地规划索引查找或表扫描是否更有效。分离逻辑将允许在每个场景中使用最有效的计划。

我不清楚@ENDE是一个变量还是一个输入错误我甚至没有注意到有两个变量。。。我将假设这是一个打字错误,但希望OP能澄清很多。这对我很有效。现在我更明白了。@加雷特
SELECT  <columns>
FROM    <tables>
WHERE   m.LONR = 310
AND     @End = 310;
UNION ALL
SELECT  <columns>
FROM    <tables>
WHERE   m.LONR <> 310
AND     @End <> 310;  --OR ISNULL(@End, 0) <> 310 to deal with NULLs
m.LONR = 310
m.LONR <> 310