SQL 查询的 WHERE 子句中的 CASE 语句。 COUNT 子句有点复杂
这是在 sql server 2005 中。我有两个表:customers
和 orders
。有一个存储过程有一个参数minimumorders
(0 或大于零是可能的值)。我想避免像上面那样使用 IF ELSE
块,并使用 CASE
语句。有没有办法可以在 WHERE
子句中使用 CASE
语句来避免代码中的 IF ELSE
块?目前IF
和IF
上都有5 行。重复 ELSE
块。我不想让他们重复。我期待着像下面这样的查询。
CREATE PROC STOREDPROC1
@MinimumOrders INT AS IF @MinimumOrders = 0
BEGIN
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
ENDELSE IF @MinimumOrders = 1
BEGIN
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
WHERE (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) > 0
END
我需要一些如下所示的 CASE
语句。不幸的是,它对我不起作用。
-------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday --------------------
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
AND C.customerid=
CASE @MiniumOrders
WHEN 0 THEN C.CustomerID
WHEN 1 THEN
CASE ( Select COUNT(O.CustomerID) FROM Orders O where O.Customerid = C.customerid )
WHEN 0 THEN 0 -- customer id = 0 means no match
ELSE C.CustomerID
END
END
-------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday --------------------
This is in sql server 2005. I have two tables: customers
and orders
. There's a stored procedure that has a parameter minimumorders
(0 or great than zero are possible values). I want to avoid an IF ELSE
block like above and go with a CASE
statement. Is there a way I can use a CASE
statement in the WHERE
clause to avoid the IF ELSE
block in the code? At the moment 5 lines on both the IF
& ELSE
blocks are repeated. I dont want them repeating. I am looking forward for a query like the following.
CREATE PROC STOREDPROC1
@MinimumOrders INT AS IF @MinimumOrders = 0
BEGIN
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
ENDELSE IF @MinimumOrders = 1
BEGIN
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
WHERE (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) > 0
END
I need some CASE
statement like the following. it does not work for me unfortunately.
-------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday --------------------
SELECT
CUSTOMERID
, (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
FROM CUSTOMER C
AND C.customerid=
CASE @MiniumOrders
WHEN 0 THEN C.CustomerID
WHEN 1 THEN
CASE ( Select COUNT(O.CustomerID) FROM Orders O where O.Customerid = C.customerid )
WHEN 0 THEN 0 -- customer id = 0 means no match
ELSE C.CustomerID
END
END
-------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday --------------------
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
考虑使用联接和 HAVING 子句:
Consider using a join and a HAVING clause:
考虑使用窗口
COUNT
子句。由于我没有有关您情况的所有详细信息,因此我提供了整个测试用例。您关心的部分是底部的SELECT
。Consider using a windowed
COUNT
clause. Since I don't have all the details on your situation, I've included an entire test case. The part you care about is theSELECT
at the bottom.