【问题标题】:IF ELSE in a stored procedure when you are Creating a #TempTable创建 #TempTable 时存储过程中的 IF ELSE
【发布时间】:2016-04-05 21:32:52
【问题描述】:

我试图让这个存储过程只在函数等于特定 ID 号时返回特定行。例如,if @RentalOnly = 'Y' 则只返回 productID 在 '3367' 或 '3367G' 和 if @RentalOnly = 'N' 中的行,然后返回所有其他不包含此 productID 的行。

这是我目前所拥有的。

alter Procedure [dbo].GetAllProductIDs
    @StartDate datetime,
    @EndDate datetime,
    @RentalOnly char(1)
AS
begin
    SET NOCOUNT ON;

    CREATE TABLE #GetAllProductIDs
    (      
        [Status] nvarchar(30),
        [To Set Date] datetime,
        [Order ID] int,
        [Product ID] nvarchar(10),
        [PPArea] char(2),
        [OrderLineNo] nvarchar(10),
        [OrigSalesman] nvarchar(30),
        [Enterby] int,
        [Rental Month] int,
        [Quantity] int,
        [Quoted$] money,
        [EXT$] money,
        [Mo Base Rental] money,
        [Ext. Base Rental] money,
        [Quoted Mo Rent] money,
        [3367 Total$ vs. Base Total$] money,
        [3367 % Total vs. Base Total] float
    )

    insert #GetAllProductIDs
       exec TempPower_AZ.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_LV.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_OC.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_SD.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_RS.dbo.GetAllProductIDs @StartDate, @EndDate

    if (@RentalOnly = 'Y')
    begin
        Select * 
        from #GetAllProductIDs
        where [Product ID] in ('3367', '3367G')

        return
    end

    if (@RentalOnly = 'N')
    begin
        Select * 
        from #GetAllProductIDs
        where [Product ID] not in ('3367', '3367G')

        return
    end
end

【问题讨论】:

  • 那么,忘记 IF/ELSE 并使用类似这样的 WHERE 子句怎么样? WHERE (@RentalOnly = 'Y' AND productID IN ('3367', '3367G')) OR (@RentalOnly = 'N' AND productID NOT IN ('36367, '3367G'))
  • 有什么问题?
  • 当@RentalOnly 是 'Y' 或 'N' 以外的值时应该返回什么?您是在问问题还是只是提供状态报告?
  • 如果 RentalOnly = 'Y' 则仅返回 productID 在 '3367' 或 '3367G' 中的行,如果 RentalOnly = 'N' 则返回所有其他行中没有此 productID @spencer7593
  • 如果 @RentalOnly 包含字符 'W' 怎么办?还是'5'?您想问的问题是什么?您是否在询问有关 SQL Server 的 IF ELSE 语法的问题?当@RentalOnly 不包含 'Y' 或 'N' 时,您是否问过如何返回空结果?完全不清楚你在问什么

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

问:我如何让它根据输入到@RentalOnly 的这两个值('Y' 或'N')返回行,如果没有输入,它将只返回所有产品 ID

答:要返回所有产品 ID,只需运行不带 WHERE 子句的 SELECT。

但前提是“如果什么都没输入”

@RentalOnly 的哪些值或哪些值可以满足“如果没有输入任何内容”的条件? NULL 是否满足该条件?空间? 'W' ? 'Y' 或 'N' 以外的任何字符?

如果这是我们要实现的逻辑:

IF @RentalOnly is 'Y', return the specified subset from the table
ELSE IF @RentalOnly is 'N', return a different subset from the table
ELSE (for all other values of @RentalOnly) return the whole table

作为如何使用IF...ELSE 块实现该逻辑的示例...

IF (@RentalOnly = 'Y')
  Select * from #GetAllProductIDs where [Product ID] in ('3367', '3367G')
ELSE
  BEGIN
    IF (@RentalOnly = 'N')
      Select * from #GetAllProductIDs where [Product ID] not in ('3367', '3367G')
    ELSE
      Select * from #GetAllProductIDs
  END
RETURN

ELSE 不是绝对必要的。如果我们将条件编码为互斥,我们可以得到等价的结果:

IF (@RentalOnly = 'Y')
  Select * from #GetAllProductIDs where [Product ID] in ('3367', '3367G')
IF (@RentalOnly = 'N')
  Select * from #GetAllProductIDs where [Product ID] not in ('3367', '3367G')
IF (@RentalOnly IS NULL OR @RentalOnly NOT IN ('Y','N')
  Select * from #GetAllProductIDs
RETURN

正如 DavidG 在他的回答中指出的那样,完全没有必要使用 IF。可以将“if else”逻辑移到单个 SELECT 语句的 WHERE 子句中。例如:

Select * from #GetAllProductIDs
 WHERE ( @RentalOnly IN ('Y') AND [Product ID] IN ('3367', '3367G') )
    OR ( @RentalOnly IN ('N') AND [Product ID] NOT IN ('3367', '3367G') ) 
    OR ( @RentalOnly NOT IN ('Y','N') OR @RentalOnly IS NULL )
RETURN

【讨论】:

  • 肯定比我的回答详细得多!如果我不得不猜测,我会说 @RentalOnly 的值永远不会有另一个值,但处理这种情况很好。
  • 我认为 OP 确实想要处理其他值,重新 OP 评论“我如何让它根据输入到 RentalOnly 的这两个值返回行,如果没有输入它只会返回所有产品ID。它包含在对问题的评论中,它包含在原始问题中。(如果我们不知道问题是什么,很难回答所提出的问题。)
  • @DavidG:在您发布答案之后提供了规范的说明。我提出了一个关于此的问题作为评论,要求澄清。 OP 作为回应发表了评论,重复了不完整的规范,这并没有真正回答我提出的问题。我再次询问,然后 OP 再次回复,重复了相同的规范,并添加了关于“如果没有输入任何内容”的内容。
【解决方案2】:

我会完全放弃IF/ELSE 逻辑,只需在一个查询中完成所有操作,如下所示:

SELECT
    *
FROM 
    #GetAllProductIDs
WHERE 
    (@RentalOnly = 'Y' AND productID IN ('3367', '3367G')) 
OR  (@RentalOnly = 'N' AND productID NOT IN ('36367, '3367G'))

【讨论】:

  • 如果IF 逻辑被删除,那么将对@RentalOnly 的所有值执行此查询。当@RentalOnly 不是“Y”或“N”时,查询将返回一个空集。这与不返回结果集的原始过程不同。这可能是适合 OP 的方法。但目前尚不清楚这是否回答了所提出的问题。
  • 我已经这样做了,没有任何回报。它不返回字段名称,但行中没有任何数据? @大卫G
  • @ETA 所以你的问题可能是临时表中的数据,而不是逻辑中的数据。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多