3

我正在尝试执行 sql 查询并根据参数是否为空来动态构建 where 条件。我有这样的事情:

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

4

3 回答 3

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 提示,否则性能会很差。

值得一读:

于 2013-10-23T15:46:16.740 回答
1

您不能动态编写WHERE子句,但可以使用复合语句来达到预期的效果。由于在 SQLNULL永远不会等于任何值,因此您实际上可以实现一个非常优雅的查询:

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
于 2013-10-23T15:50:52.197 回答
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

此外,您不能WHERECASE.

改用这个。它更简单,并且有效;)。

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

NULL如果您已ANSI_NULLS设置,您甚至不必担心这两个变量都是。默认情况下,Sql Server 不会匹配记录,其中NULL=NULL.

于 2013-10-23T15:50:06.067 回答