2014-12-05 4 views
0

У меня есть следующая хранимая процедура. Я имею переменную @PercentCleared.Любой другой способ избежать, если условие else

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, либо укажите более значимое имя. –

+0

Извините, Джонатан, я переформатирую сейчас – Usher

+0

Является ли «else if» предназначаться просто «еще»? Не существует условия для «if» части «else if». Это пустяки. Остальное легче читать сейчас. Вы не можете использовать что-то вроде 'CASE @PercentCleared WHEN> = 70 THEN @PercentCleared - @TenPercent ELSE @PercentCleared END' вместо условия' @ PercentCleared' в одном из операторов SELECT, поэтому вам тогда не нужно другого или внешнего IF/ELSE. –

ответ

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

Вы можете поместить логику в предложении 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

Вы можете достичь этого без ДЕЛУ или IF заявления повторно написания SQL, как это ...

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

Надеется, что это помогает не только в этой ситуации, но многое подобного situtations.