2013-07-16 99 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的上科,WHERE条款的AND部分丢失;在下面的分支中,检查MarkaId@BrandFilter字符串的一部分。当未指定@BrandFilter时,OR条件使相同条件成立。

相关问题