2017-02-21 69 views
4

我想選擇某品牌的產品,如果品牌未包含在表格中,請選擇品牌名稱爲「all」的產品。我有這樣的表格:如何根據SQL Server中是否存在大小寫選擇行?

Discount | Brand 
    20 | ford 
    10 | all 

而且我有名爲@Brand_name的查詢參數。我想要的只是返回品牌的比率,如果存在表中。否則,返回品牌名稱爲「全部」的費率。什麼是這樣做的正確的查詢。謝謝你的幫助。

+0

可以應用情況,然後再寫查詢。 –

回答

7

試試這個:

SELECT TOP 1 Discount 
FROM mytable 
WHERE Brand = @Brand_name OR Brand = 'all' 
ORDER BY CASE 
      WHEN Brand = 'all' THEN 1 
      ELSE 0 
     END 

查詢返回總是一個紀錄,因爲與Brand = 'all'記錄被選中,TOP 1SELECT子句中使用。

如果您有更多的一個'Brand'記錄,你想個個的返回,那麼你可以使用下面的查詢:

;WITH CTE AS (
    SELECT Discount, 
      RANK() OVER (ORDER BY CASE 
            WHEN Brand = 'all' THEN 1 
            ELSE 0 
            END) AS rnk 
    FROM mytable 
    WHERE Brand = @Brand_name OR Brand = 'all' 
) 
SELECT Discount 
FROM CTE 
WHERE rnk = 1 

Demo here

+0

我需要第二個解決方案,因爲有多個具有相同品牌名稱的行。它解決了這個問題。謝謝。 –

2

試試這個請:

IF EXISTS (SELECT 1 FROM table1 WHERE Brand = @Brand_name) 
BEGIN 
    SELECT Discount FROM table1 WHERE Brand = @Brand_name 
END 
ELSE 
BEGIN 
    SELECT Discount FROM table1 WHERE Brand = 'all' 
END 
0

添加這個作爲另一個溶膠ution,不知道但如果這是更好的:

SELECT TOP 1 Discount FROM (
    SELECT Discount FROM table1 WHERE [email protected]_name 
    UNION SELECT Discount FROM table1 WHERE BrandName='all' 
) discount 
+0

將返回2行@Brand_name存在。 – jarlh

+0

感謝您注意@jarlh,編輯。 –

0

我會去不同的方法,我認爲可能會產生更好的性能:

SELECT top 1 discount , 
      brand 
FROM 
    (SELECT discount , 
      brand , 
      selector , 
      min(selector) over() [minselect] 
    FROM 
    (SELECT discount , 
       brand , 
       1 [selector] 
     FROM mytable 
     WHERE brand = 'ford' 
     UNION ALL 
     SELECT discount , 
       brand , 
       2 [selector] 
     FROM mytable WHERE brand = 'all') r 
    GROUP BY discount , 
      brand , 
      selector) r 
WHERE selector = minselect 
ORDER BY discount DESC 
相關問題