2016-09-17 2 views
1

Я знаю, что мы можем использовать BETWEEN внутри CASE. Но у меня есть ситуация, когда я хочу сделать наоборот. Я знаю, что мы не можем вернуть больше одного значения из case case.But, как достичь ниже ситуации ??Можем ли мы использовать CASE в BETWEEN

select * from #Results 
where Num Between 
case when @StartIndex>0 then 
((@StartIndex-1) * @PageCount))+ 1)) AND (@StartIndex * @PageCount) 
else 
((@StartIndex-1) * @PageCount)+ 1) AND (((@StartIndex-1) * @PageCount)+ 1) 
+0

Да, вы можете использовать его – Sami

+0

Что такое логика вы хотите реализовать в вашем 'WHERE' пункте? –

+0

@TimBiegeleisen Если '@StartIndex> 0', то Num должно быть' BETWEEN' 2 значения '(((@ StartIndex-1) * @PageCount)) + 1)) AND (@StartIndex * @PageCount)' else '(((@ StartIndex-1) * @PageCount) + 1) И (((@ StartIndex-1) * @PageCount) + 1) ' –

ответ

1

Вам нужно AND/OR логика

SELECT * 
FROM #results 
WHERE (num BETWEEN ((@StartIndex - 1) * @PageCount) + 1 AND @StartIndex * @PageCount 
     AND @StartIndex > 0) 
     OR (num BETWEEN ((@StartIndex - 1) * @PageCount) + 1 AND ((@StartIndex - 1) * @PageCount) + 1 
      AND @StartIndex <= 0) 
1

Вы можете сделать следующее

declare @start int, 
     @end int 

set @start = ((@StartIndex -1)*PageCount) + 1 
set @end = case when @StartIndex>0 then @StartIndex * @PageCount 
       else ((@StartIndex -1)*@PageCount) +1 end 

select * from #Results 
where Num Between @start and @end 
+0

Это самый простой способ? Не можем ли мы достичь этого, не объявив еще 2 переменных? –

+1

несколько раз вам нужен ваш запрос, чтобы быть более читаемым, если вы хотите получить его за один шаг, я думаю, что другие ответы хороши, но с моей стороны код должен быть читабельным и простым в обслуживании. – Monah

1
WHERE CASE WHEN @StartIndex > 0 AND 
      Num BETWEEN (((@StartIndex-1) * @PageCount) + 1) AND 
         (@StartIndex * @PageCount) 
      THEN TRUE 
      WHEN @StartIndex > 0 AND 
      Num BETWEEN (((@StartIndex-1) * @PageCount) + 1) AND 
         (((@StartIndex-1) * @PageCount) + 1) 
      THEN TRUE 
      ELSE FALSE -- other conditions? 
     END 
1

Try Таким образом, вы просто должны использовать случай для второго условия только потому, что вы есть первое состояние такой же

SELECT * 
FROM #Results 
WHERE Num BETWEEN (((@StartIndex-1) * @PageCount)+ 1) AND 
CASE WHEN @StartIndex > 0 THEN 
    (@StartIndex * @PageCount) 
ELSE 
    (((@StartIndex-1) * @PageCount)+ 1) 
END 

В вашем коде два закрывающих кронштейна являются дополнительными или не работают должным образом '(((@ StartIndex-1) * @PageCount)) + 1))' и то, как вы работаете, также не разрешено. В пути различных условий:

SELECT * FROM #Results 
WHERE Num BETWEEN 
    CASE WHEN @StartIndex>0 THEN 
     (((@StartIndex-1) * @PageCount)+ 1) 
    ELSE 
     (((@StartIndex-1) * @PageCount)+ 1) 
    END 
    AND 
    CASE WHEN @StartIndex>0 THEN 
     (@StartIndex * @PageCount) 
    ELSE 
     (((@StartIndex-1) * @PageCount)+ 1) 
    END 
+0

Что делать, если оба значения в обоих случаях различны –

+1

@JibinBalachandran Я добавил еще одну деталь для разных случаев, пожалуйста, проверьте. благодаря – Susang

Смежные вопросы