2014-12-05 62 views
0

我有一个以下的存储过程。我有变量@PercentCleared任何其他方式,以避免如果条件

IF @PercentCleared <= 70然后我必须减去PercentCleared-10否则就这样使用。你可以请教我正确的做法吗?

DECLARE @PercentCleared INT 
    DECLARE @TenPercent int 

    SET @TenPercent = 10 

    IF(@PercentCleared <=70) 
    BEGIN 
     SELECT 
      @I, dbo.tblV.VegTypeCode, dbo.tblV.VegTypeName 
     FROM 
      dbo.tblVegetationType 
     INNER JOIN 
      dbo.tblVegFormationLink ON dbo.tblV.VegTypeID = dbo.tblVegFormationLink.VegTypeID 
     WHERE 
      dbo.tblVegetationType.PercentageCleared >=(@PercentCleared - @TenPercent) 
     WHERE 
      a.VegTypeID = dbo.tblVegetationType.VegTypeID 
      AND dbo.tblVegetationType.VegTypeID <> (SELECT VegTypeID 
                FROM @EcosystemCredits eco 
                WHERE eco.theID = @I) 
    END 
    ELSE IF 
    BEGIN 
     SELECT 
      @I, dbo.tblV.VegTypeCode, dbo.tblV.VegTypeName 
     FROM 
      dbo.tblVegetationType 
     INNER JOIN 
      dbo.tblVegFormationLink ON dbo.tblV.VegTypeID = dbo.tblVegFormationLink.VegTypeID 
     WHERE 
      dbo.tblVegetationType.PercentageCleared >[email protected] 
     WHERE 
      a.VegTypeID = dbo.tblVegetationType.VegTypeID 
      AND dbo.tblVegetationType.VegTypeID <> (SELECT VegTypeID 
                FROM @EcosystemCredits eco WHERE eco.theID = @I) 

    End 
+0

这很难读。你可以重新格式化更清晰吗? (我很抱歉,但我没有能力为你做这件事。)@ TenPercent这个名字并不是一个很好的选择。要么写10或者给它一个更有意义的名字。 – 2014-12-05 00:20:11

+0

对不起乔纳森,我现在正在格式化 – Usher 2014-12-05 00:23:05

+0

'else if'是否只是'其他'? 'else if'的'if'部分没有条件。虽然这是琐事。其余的更容易阅读。你不能在SELECT语句之一中使用'CASE @PercentCleared WHEN> = 70 THEN @PercentCleared - @TenPercent ELSE @PercentCleared END'来代替'@ PercentCleared'条件,所以你不需要其他或外部IF/ELSE。 – 2014-12-05 00:33:31

回答

2

我想你可以通过在WHERE子句

SELECT @I, dbo.tblV.VegTypeCode, dbo.tblV.VegTypeName FROM dbo.tblVegetationType 
INNER JOIN dbo.tblVegFormationLink 
    ON dbo.tblV.VegTypeID = dbo.tblVegFormationLink.VegTypeID 
WHERE dbo.tblVegetationType.PercentageCleared 
     >= @PercentCleared 
     - CASE WHEN (@PercentCleared <=70) THEN @TenPercent ELSE 0 END -- change here 
WHERE a.VegTypeID = dbo.tblVegetationType.VegTypeID 
AND dbo.tblVegetationType.VegTypeID 
    <> (SELECT VegTypeID FROM @EcosystemCredits eco WHERE eco.theID = @I) 
2

使用CASE语句,你可以把逻辑where子句中做到这一点。

SELECT @I, dbo.tblV.VegTypeCode, vt.VegTypeName 
FROM dbo.tblVegetationType vt INNER JOIN 
    dbo.tblVegFormationLink vfl 
    ON vt.VegTypeID = vlt.VegTypeID 
WHERE (vt.PercentageCleared >= @PercentCleared - (CASE WHEN @PercentCleared <= 70 THEN @TenPercent ELSE 0 END)) AND 
     (vt.VegTypeID <> (SELECT VegTypeID FROM @EcosystemCredits eco WHERE eco.theID = @I)); 

我通过使用表别名简化了查询。此外,你有两个where子句,第二个是多余的。

0

你可以做到这一点没有CASEIF声明通过重新编写SQL这样的...

WHERE 
    (@PercentCleared <=70 AND dbo.tblVegetationType.PercentageCleared >=(@PercentCleared - @TenPercent)) 
OR 
    (@PercentCleared > 70 AND dbo.tblVegetationType.PercentageCleared >= @PercentCleared) 

希望它不仅有助于在这种情况下,但许多类似situtations。