2013-07-16 2 views
2

Я хочу переписать этот код без использования каких-либо операторов if.Как я могу переписать это без использования инструкции if?

Возможно ли это?

Как использовать случай или что-то еще?

IF @BrandFilter = '' 
    BEGIN 
     SELECT * FROM 
     (
      SELECT 
       ROW_NUMBER() OVER(ORDER BY 
       CASE WHEN @SortType = '1' THEN mt.Ad END ASC, 
       CASE WHEN @SortType = '2' THEN mt.Ad END DESC, 
       CASE WHEN @SortType = '3' THEN mt.Fiyat END ASC, 
       CASE WHEN @SortType = '4' THEN mt.Fiyat END DESC) AS RowNr, * 
      FROM @MainTable mt 
      WHERE mt.Fiyat > @MinPrice AND mt.Fiyat < @MaxPrice  
     ) Result 
     WHERE RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 
    END 
ELSE 
    BEGIN 
     SELECT * FROM 
     (
      SELECT 
       ROW_NUMBER() OVER(ORDER BY 
       CASE WHEN @SortType = '1' THEN mt.Ad END ASC, 
       CASE WHEN @SortType = '2' THEN mt.Ad END DESC, 
       CASE WHEN @SortType = '3' THEN mt.Fiyat END ASC, 
       CASE WHEN @SortType = '4' THEN mt.Fiyat END DESC) AS RowNr, * 
      FROM @MainTable mt 
      WHERE mt.Fiyat > @MinPrice AND mt.Fiyat < @MaxPrice 
      AND mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf) 
     ) Result 
     WHERE RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 
    END 

Этот код разница,

AND mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf) 

Спасибо ..

ответ

2

Здесь вы идете:

SELECT * FROM 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY 
     CASE WHEN @SortType = '1' THEN mt.Ad END ASC, 
     CASE WHEN @SortType = '2' THEN mt.Ad END DESC, 
     CASE WHEN @SortType = '3' THEN mt.Fiyat END ASC, 
     CASE WHEN @SortType = '4' THEN mt.Fiyat END DESC) AS RowNr, * 
    FROM @MainTable mt 
    WHERE mt.Fiyat > @MinPrice AND mt.Fiyat < @MaxPrice 
    AND (@BrandFilter = '' or mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf)) 
) Result 
WHERE RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 

вы должны добавить проверку, если @brandfilter не пуст, прежде чем расщеплению его

(@BrandFilter = '' or mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf)) 
+0

Ты лучший, я вижу эту технику сейчас. Огромное спасибо.. –

2

Как это:

SELECT * FROM 
(
    SELECT 
      ROW_NUMBER() OVER(ORDER BY 
      CASE WHEN @SortType = '1' THEN mt.Ad END ASC, 
      CASE WHEN @SortType = '2' THEN mt.Ad END DESC, 
      CASE WHEN @SortType = '3' THEN mt.Fiyat END ASC, 
      CASE WHEN @SortType = '4' THEN mt.Fiyat END DESC) AS RowNr, * 
    FROM @MainTable mt 
    WHERE mt.Fiyat > @MinPrice AND mt.Fiyat < @MaxPrice  
    AND (mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf) OR @BrandFilter = '') 
) Result 
WHERE RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 

В верхней ветви вашего if, то AND часть пункта WHERE отсутствует; в нижней ветке это проверка MarkaId в составе строки @BrandFilter. Условие OR делает то же условие истинным, если @BrandFilter не указан.

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