sql查询其中参数null不为null

时间:2013-10-23 15:42:51

标签: sql sql-server-2008 tsql sql-server-2008-r2 case

我正在尝试执行sql查询并动态构建where条件,具体取决于参数是null还是no。 我有这样的事情:

SELECT tblOrder.ProdOrder, tblOrder.Customer FROM tblOrder 
CASE WHEN @OrderId IS NOT NULL
THEN 
WHERE tblOrder.OrderId = @OrderId
ELSE
END
CASE WHEN @OrderCustomer IS NOT NULL
THEN
AND tblOrder.OrderCustomer = @OrderCustomer
ELSE
END
END

这不起作用,但这只是一个小型原型如何组装查询,所以如果orderid不是null包含在where子句中,或者如果ordercustomer不是null则包含在where子句中。但我在这里看到问题,例如,如果ordercustomer不为null但orderid为null,则会出现错误,因为不包含where关键字。 我有什么建议可以解决这个问题。 在此先感谢Laziale

3 个答案:

答案 0 :(得分:4)

这应该做你想要的:

SELECT tblOrder.ProdOrder, tblOrder.Customer 
FROM tblOrder 
WHERE ( @OrderId IS NULL OR  tblOrder.OrderId = @OrderId )
AND   ( @OrderCustomer IS NULL OR  tblOrder.OrderCustomer = @OrderCustomer )
OPRION (RECOMPILE)

但是如你所说,你应该包含OPTION RECOMPILE提示,否则会有不好的表现。

值得一读:

答案 1 :(得分:1)

您无法动态编写WHERE子句,但可以使用复合语句来实现所需的效果。 由于在SQL NULL 从不等于任何值,您实际上可以实现一个非常优雅的查询:

SELECT tblOrder.ProdOrder, tblOrder.Customer 
FROM   tblOrder 
WHERE  
-- Can only be true if @OrderId isn't NULL, no need to state it explicitly
tblOrder.OrderId = @OrderId 
OR 
-- Thanks to short-circuit evaluation, 
-- we only get here if the first condition evaluated as false
tblOrder.OrderCustomer = @OrderCustomer

答案 2 :(得分:0)

此查询完全错误。格式化后,您可以看到有“空白”ELSE语句,并且最后还有额外的END:):

SELECT 
    tblOrder.ProdOrder, tblOrder.Customer 
FROM tblOrder 
CASE 
    WHEN @OrderId IS NOT NULL THEN WHERE tblOrder.OrderId = @OrderId
    ELSE 
END
CASE 
    WHEN @OrderCustomer IS NOT NULL THEN AND tblOrder.OrderCustomer = @OrderCustomer
    ELSE 
END
END

此外,您无法从WHERE返回CASE条款。

请改用它。它更简单,而且有效;)。

SELECT 
    tblOrder.ProdOrder, tblOrder.Customer 
FROM tblOrder 
where
    tblOrder.OrderId = @OrderId
    OR 
    tblOrder.OrderCustomer = @OrderCustomer

如果设置了NULL,您甚至不必担心这两个变量都是ANSI_NULLS。默认情况下,Sql Server将不匹配NULL=NULL

的记录