嵌套在SQL Server存储过程中的案例

问题描述 投票:0回答:1
CREATE PROCEDURE dbo.sample @start DATE,@end DATE,@type VARCHAR(5)
AS
    SELECT o.O_Id,
           o.Sale_Price,
           o.Private_Band,
           c.Date_of_Purchase,
           c.Date_Redeemed,
           c.Type,
           c.Points_Issued,
           o.Date_of_Purchase
    FROM Order_Details o,
         Transaction_Historys c
    WHERE CASE
               WHEN o.Date_of_Purchase BETWEEN @start AND @end
                AND (c.Type = @type) THEN 1
               WHEN c.Type = @type THEN 1
               ELSE 0
          END = 1
GO
EXECUTE dbo.sample @type=NULL,@start='2012-03-01',@end='2012-03-30'
GO

当我用 @type=null 我没有得到数据。我需要处理以下两种情况

INput CASE1=wen @type is NULL-> WHERE c.Date_Redeemed BETWEEN @Start AND @End-- this should execute
If CASE2=wen @start,@end is NULL->WHERE c.Type=@type-- this should execute
sql-server stored-procedures where-clause
1个回答
1
投票

重写。

WHERE
   o.Date_of_Purchase BETWEEN @start AND @end OR
   c.Type = @type OR
   (@type IS NULL and @start is null)
  • 将type设置为null,startend设置为非null来进行日期搜索。
  • 将startend设置为null,输入为非null,进行类型搜索
  • 将type和start设置为null,返回所有记录。如果不需要记录,请删除 OR (@type IS NULL and @start is null)

正如我所评论的,只有 IS NULL 当处理空值时,可以用来返回true。如果@start为空,那么 o.Date_of_Purchase BETWEEN @start AND @end 将始终为false,所以将使用@type代替。如果@type为空,则使用@start@end。如果这两个条件都是空的,那么前两个条件总是假的,所以你只需要决定如果这两个条件都是空的该怎么办。如果所有的数据都被提供,你可能还想要一个不同的行为,在这种情况下,你可以考虑使用显式。

WHERE
   (c.Type = @type AND o.Date_of_Purchase BETWEEN @start AND @end) OR
   (@start IS NULL AND c.Type = @type) OR
   (@type IS NULL and o.Date_of_Purchase BETWEEN @start AND @end) OR
   (@start IS NULL AND @type IS NULL)

在这种情况下,你可以看一下是否明确:

  • 如果两者都提供,则只返回类型和日期匹配的记录。
  • 如果没有提供类型,则使用日期。
  • 如果没有提供日期类型,则使用
  • 如果没有提供任何内容,所有的行都会返回。要使没有记录返回,请删除最后一个谓词
© www.soinside.com 2019 - 2024. All rights reserved.