2015-04-01 69 views
0

我想要做的是基于where子句条件之间的条件切换..这是可能的吗?Where clause with switch case or dynamic where

这是一个例子,实际的过程更长,我不想使用,如果选择。

可能吗?

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 
+1

CASE是一个带有一个输出的表达式,不能像IF条件那样使用它来控制流。 http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression – 2015-04-01 18:56:16

+0

@AaronBertrand如果你不能使用,那么会有什么替代? – NoviceDeveloper 2015-04-01 18:58:16

+0

'WHERE s.SupplierName = o.SupplierName AND o.Row = CASE @city当'NY'那么'新的'ELSE o.Row END'。如果o.Row可以为空,则更复杂一点。 – 2015-04-01 18:59:38

回答

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 

你可以得到你想要的那样复杂,但看你怎么做,以保持合理的性能。

+0

这给1或0 ..不完全得到我想要的结果。 – NoviceDeveloper 2015-04-01 19:34:34

+0

你的逻辑将产生一个1,然后where子句将成立。 – JBrooks 2015-04-01 19:39:17

+0

@NoviceDeveloper - 请参阅[本](http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition/10260297#10260297)另一种解释。 – HABO 2015-04-01 19:58:14

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'); 

这假定@cityNULL。包含这种可能性的逻辑稍微复杂一些(尽管看起来没有必要)。

+0

不会为这两种情况拉动记录吗?我认为它的确如此......我希望它能够在纽约市和纽约市都得到,如果情况并非如此,那么只有当纽约市...不是两个。 – NoviceDeveloper 2015-04-01 19:33:46

+0

@NoviceDeveloper。 。 。这实现了你试图用'case'表达式表达的逻辑。 '@ city'变量只有一个值用于执行查询,因此只有在任何给定的运行中才会使用该条件。 – 2015-04-01 22:25:35