2013-07-16 158 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條件使相同條件成立。

相關問題