2013-07-15 84 views
1

你能告訴我爲什麼我得到這個錯誤嗎?什麼樣的表達式「=」?

我不認爲使用任何類型的表達式「=」?

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 (CASE WHEN @BrandFilter != '' 
          THEN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf) 
          ELSE (mt.MarkaId) 
          END) 
    ) Result 
WHERE 
    RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 

SQL Server出現此錯誤;

子查詢返回的值超過1。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

我的分裂函數返回多表,但我寫的IN沒有=

感謝

+3

我不認爲情況下,可以返回表值,僅標量 –

+0

你能不能用言語形容* *正是你想要的時候發生什麼'@BrandFilter ='''? –

回答

6

CASE WHEN @BrandFilter != '' THEN條款預計一個標值,但要調用UDF,可以返回多行。

+0

爲什麼它期望我使用的單個標量值「AND mt.MarkaId IN」 –

+0

您從split函數獲取一個值表,但是您通過一個* CASE表達式來傳遞它*期望一個標量值*。這是由'IN'表達式包圍的事實是無關緊要的。 –

2

你不能以這種方式使用CASE。它看起來像你想代碼的情況是這樣的:

(@BrandFilter = '' OR 
@BrandFilter != '' AND mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ','))) 
相關問題