我正在尝试执行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
答案 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
。