Where子句用switch case或dynamic where

时间:2015-04-01 18:53:17

标签: sql sql-server sql-server-2008 tsql

我想要做的是基于where子句条件之间的条件切换..这可能吗?

这是一个例子,实际程序要长得多,我不想在选择时使用if。

有可能吗?

declare @city varchar(100) = 'NY'

SELECT s.suppliers, o.order
FROM suppliers s
INNER JOIN orders o ON s.id = o.id
WHERE 
    CASE WHEN @city = 'NY' 
           THEN (s.SupplierName = o.SupplierName AND o.Row = 'New') 
         ELSE s.SupplierName = o.SupplierName 
    END

2 个答案:

答案 0 :(得分:2)

我之前做过类似的事情:

WHERE s.SupplierName = o.SupplierName 
AND
CASE WHEN @city = 'NY' AND o.Row = 'New' THEN 1
WHEN @city <> 'NY' THEN 1
ELSE 0 END = 1

你可以随心所欲地复杂化,但要注意你做了什么来保持合理的表现。

答案 1 :(得分:1)

你不需要case,你可以将常见条件放在ON条款中:

SELECT s.suppliers, o.order
FROM suppliers s INNER JOIN 
     orders o
     ON s.id = o.id AND s.SupplierName = o.SupplierName
WHERE (@city = 'NY' AND o.Row = 'New') OR
      (@city <> 'NY');

这假定@city不是NULL。包含这种可能性的逻辑稍微复杂一些(虽然看起来没必要)。