2016-03-12 157 views
3

我是SQL新手,我有點迷茫。我有一個包含產品,各個領域,如productname表,categorySQL查詢中的可選參數

我想有一個查詢在那裏我可以這樣說:在一些類別,在他們的產品名有一個特定的單詞選擇所有產品。複雜的因素是我只想返回該子集的特定範圍。所以我也想說回到我的100到120產品落在該規範。

我用Google搜索,發現這個查詢:

WITH OrderedRecords AS 
( 
    SELECT *, ROW_NUMBER() OVER (ORDER BY PRODUCTNUMMER) AS "RowNumber", 
    FROM (
     SELECT * 
     FROM SHOP.dbo.PRODUCT 
     WHERE CATEGORY = 'ARDUINO' 
     and PRODUCTNAME LIKE '%yellow%' 
    ) 
) 
SELECT * FROM OrderedRecords WHERE RowNumber BETWEEN 100 and 120 
Go 

的查詢工作在一定程度上,但它的過濾,所以我不會得到足夠的記錄之前指定的行號,我不知道我可以如果沒有參數,則處理它。理想情況下,我希望能夠不給一個類別和搜索詞,它只會列出所有產品。

我不知道如何實現這個,但任何幫助表示讚賞!

回答

3

如果您只需分頁查詢並返回特定範圍的結果,則可以簡單地使用OFFSET FETCH Clause

這樣就沒有必要通過RowNumber過濾結果項目。我認爲這個解決方案是比較容易:

SELECT * 
FROM SHOP.dbo.PRODUCT 
WHERE CATEGORY = 'ARDUINO' AND PRODUCTNAAM LIKE '%yellow%' 
ORDER BY PRODUCTNUMMER 
OFFSET 100 ROWS   -- start row 
FETCH NEXT 20 ROWS ONLY -- page size 

瞭解更多Pagination with OFFSET/FETCH

0

你是什麼意思它過濾前分配ROWNUMBER? Category和ProductName是子查詢的一部分...因此,如果產品表具有10k條記錄,並且只有1k條符合您的條件,則CTE的結果將爲1k,因此RowNumber BETWEEN 100和120的工作原理。測試一下,從兩個select語句中刪除where子句,並且您將獲得所有產品表的rownumber。然後回到類別和產品名稱過濾器中,並且您的RowNumber用於按照ProductNumber排序的過濾器,因此,當您在100到120之間添加時,這是基於您所描述的正確解決方案。

WITH OrderedRecords AS 
( 
     SELECT ROW_NUMBER() OVER (ORDER BY PRODUCTNUMMER) AS "RowNumber" 
      , * 
     FROM SHOP.dbo.PRODUCT 
     WHERE CATEGORY = 'ARDUINO' 
     and PRODUCTNAAM LIKE '%yellow%' 
    ) 
) 
SELECT * 
FROM OrderedRecords 
WHERE RowNumber 
BETWEEN 100 and 120 
Go 
3

建立在什麼esiprogrammer表現出他對如何使用分頁一定範圍內只返回行的答案。

你的第二個問題是:

理想我想能不能給一個類別和搜索詞,它只是列出所有產品。

您可以有兩個查詢/存儲過程,一個用於查找特定參數的情況,另一個用於查找不帶參數的情況。

或者,如果你堅持不讓一個查詢/存儲過程的所有情況,有兩種選擇:

  1. 構建一個只有所存在的過濾器動態SQL語句;使用EXECUTE (@sql)EXECUTE sp_executesql @sql
  2. 構建執行它捕獲所有查詢

實施例選項2:

-- if no category is given, it will be NULL 
DECLARE @search_category VARCHAR(128); 

-- if no name is given, it will be NULL 
DECLARE @search_name VARCHAR(128); 

SELECT * 
FROM SHOP.dbo.PRODUCT 
WHERE (@search_category IS NULL OR [email protected]_category) AND 
     (@search_name IS NULL OR PRODUCTNAAM LIKE '%'[email protected]_name+'%') 
ORDER BY PRODUCTNUMMER 
OFFSET 100 ROWS 
FETCH NEXT 20 ROWS ONLY 
OPTION(RECOMPILE); -- generate a new plan on each execution that is optimized for that execution’s set of parameters