我试图让这个存储过程仅在函数等于特定ID号时返回特定行。例如,if @RentalOnly = 'Y'
只返回productID
所在的行' 3367&#39}。或者! 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
答案 0 :(得分:1)
我会完全放弃IF
/ ELSE
逻辑,只需在这样的单个查询中完成所有操作:
SELECT
*
FROM
#GetAllProductIDs
WHERE
(@RentalOnly = 'Y' AND productID IN ('3367', '3367G'))
OR (@RentalOnly = 'N' AND productID NOT IN ('36367, '3367G'))
答案 1 :(得分:1)
问:如何根据输入到@RentalOnly中的这两个值(' Y'或者' N')返回行,如果没有输入任何内容,它将返回所有的产品ID
答:要返回所有productID,只需运行没有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