如何使用参数 select 使用哪个查询?

How to use a parameter to select which query to use?

我正在制作一份报告,我需要在此报告中显示在过去 2 年中销售额超过 5000 美元或在报告时销售额超过 500 美元的帐户 运行 .

DECLARE @Options INT = 1

--When I put 0 then
SELECT 
    Customer, SUM(Price) AS SALES
FROM 
    SOP30200 (NOLOCK)
WHERE 
(PostDate BETWEEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND getdate())
GROUP BY Customer
HAVING SUM(Price) > 500
ORDER BY Customer

--When I put 1 then
SELECT 
    Customer, SUM(Price) AS SALES
FROM 
    SOP30200 (NOLOCK)
WHERE 
    PostDate BETWEEN DATEADD(Year,-2,GETDATE()) AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > 5000
ORDER BY Customer

一个简单的方法是将 "AND @Options = 0" 添加到第一个查询的 WHERE 子句中,将 "AND @Options = 1" 添加到第二个查询的 WHERE 子句中。然后通过在它们之间放置 UNION 将两个查询合并为一个。

用最简单的术语来说,就像这样:

IF @Options = 1
  BEGIN
   ... query 1
  END
ELSE
  BEGIN
   ... query 2
  END
ELSE

一种方法是使用 CASE 语句:

SELECT 
    Customer, SUM(Price) AS SALES
FROM 
    SOP30200 (NOLOCK)
WHERE 
    PostDate BETWEEN CASE @Options
            WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
            WHEN 1 THEN DATEADD(Year,-2,GETDATE())
            ELSE NULL
        END
        AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > CASE @Options
        WHEN 0 THEN 5000
        WHEN 1 THEN 500
        ELSE NULL
    END
ORDER BY Customer;

这看起来不太漂亮,但应该可以工作(我可能留下了语法错误)。

另一种方法是声明变量并在查询中使用它们:

DECLARE @PriceTreshold INT = CASE @Options
        WHEN 0 THEN 5000
        WHEN 1 THEN 500
        ELSE NULL
    END;
DECLARE @PostDateFrom DATETIME2 = CASE @Options
        WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
        WHEN 1 THEN DATEADD(Year,-2,GETDATE())
        ELSE NULL
    END;

SELECT 
    Customer, SUM(Price) AS SALES
FROM 
    SOP30200 (NOLOCK)
WHERE 
    PostDate BETWEEN @PostDateFrom AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > @PriceTreshold
ORDER BY Customer;

您的查询并没有什么不同,它们只是基于 @Options.

具有不同的过滤条件

如果它们真的那么不同,你可以使用这种语法:

IF @Options = 0
BEGIN
    -- SQL query If @Options = 0
END
ELSE IF @Options = 1
BEGIN
    -- SQL query If @Options = 1
END

但你的情况不需要这样做。