2010-01-06 115 views
3

我必须根据条件运行SQL查询。 有2个AND条件只有在条件满足时才需要执行。我们可以在这里使用CASE语句吗?如果是这样如何?或者还有其他方法吗?在SQL SELECT语句中给出条件

SELECT * FROM MyTable 
WHERE [email protected] 

if condition1 here 
AND col2 = @val2 
end if 

if condition2 here 
AND col3 = @val3 
end if 

任何人都可以帮助我这个请。我使用SQL Server 2005的

+0

其中任何答案有帮助吗? :) – 2010-05-19 20:14:28

回答

8

让他们在您的查询,像这样:

SELECT * FROM MyTable 
WHERE [email protected] 
And (Not Condition1 Or col2 = @val2) 
And (Not Condition2 Or col3 = @val3) 

所以,如果没有条件1(意为:条件1为true),然后COL2(必须)= @ VAL2 。

(我改变了第二个条件逻辑和COL3 = @ VAL3,因为你曾反复COL2 = @ VAL2

编辑回应评论: 给我的标准的一个例子为condition1。明确如果语法未在t-sql中的查询中使用。比方说,对于第一个标准来说,“以前的订单”必须小于20,并且。 。 。如果没有名字,第二个标准就很重要。它会是:

SELECT * FROM MyTable 
WHERE [email protected] 
And (MyTable.OrderCount > 19 Or col2 = @val2) 
And ((Not MyTable.FirstName Is Null) Or col3 = @val3) 

不要这样想,“这个标准很重要,如果这种情况是真的”。所有重要的因素进入where子句。你必须了解Or/And/Not和操作顺序。这需要练习才能获得好处。如果你需要仔细考虑几分钟,不要担心,有时候我们其他人也一样。

+0

这不是sargable – 2010-01-06 17:23:27

+0

嗨thnx ...我不擅长的SQL语法,这可能听起来很愚蠢,但我如何使用if语句,而不是我的condition1在SQL中? SELECT * FROM MyTable的 WHERE COL1 = @ VAL1 和(非条件1或者COL2 = @ VAL2) 和(非条件2或者COL3 = @ VAL3) – ajithmanmu 2010-01-06 17:35:52

+0

我想优化搜索是下一个步骤。我们对建议最佳策略的条件还是不够了解,或者即使规模保证任何此类努力。 – 2010-01-06 19:51:40

0

我假设你打算有两个不同的条件和col/val对,与你的文章中不一样。

如果“条件”的东西,查询的上下文中存在的(即不属于外部因素),那么你可以做这样的事情:

SELECT * FROM MyTable 
WHERE col1 = @val1 
    AND (NOT condition1 OR (condition1 AND col2 = @val2)) 
    AND (NOT condition2 OR (condition2 AND col3 = @val3)) 

编辑:OK,所以“conditionX AND “是多余的,但我认为这是一个很好的主意,因为它明确了构造的意图。

2

假设条件,可以写成一个SQL表达式:

SELECT * FROM MyTable 
WHERE [email protected] AND 
(NOT(condition_1) OR col2 = @val2) AND 
(NOT(condition_2) OR col3 = @val3) 
0

人的人没有关于SQL的线索,这些天... ...惊人

SELECT * 
FROM MyTable 
WHERE [email protected] 
and case when condition1 then col2 = @val2 else 1=1 end 
and case when condition2 then col3 = @val3 else 1=1 end 
+0

我发现WHERE子句中的CASE运行真的很糟糕当我尝试 – gbn 2010-01-06 19:35:18

+0

这就是为什么你要评估一个案例,对于小数据集(少于500k行),对于较大的I建议,以编程方式处理。但速度有助于解决一个快速的问题是非常有用的。 – MCoelho 2010-01-07 03:28:17

+0

“这些天,人们对SQL没有任何线索......令人惊叹......”粗鲁无用。 – secretwep 2014-08-19 21:01:46

1

如果字段不可为空(和don't criticise, try it

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    col1 = @val1 AND 
    col2 = ISNULL(@val2, col2) AND 
    col3 = ISNULL(@val2, col3) 

否则(语句级别重新编译,使得它的SQL Server 2005+上可以接受的)

if condition1 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col2 = @val2 


if condition2 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col3 = @val3 

else 
SELECT * FROM MyTable 
WHERE [email protected] 

或者使用其他的解决方案提供