在SQL SELECT语句中给出条件

时间:2010-01-06 17:05:11

标签: sql sql-server-2005 tsql

我必须根据条件运行SQL查询。 只有满足它们的if条件时,才需要执行2个AND条件。我们可以在这里使用CASE声明吗?如果是这样的话?还是有其他方法??

SELECT * FROM MyTable
WHERE col1=@val1

if condition1 here
AND col2 = @val2
end if

if condition2 here
AND col3 = @val3
end if

请有人帮我这个。我正在使用sql server 2005。

7 个答案:

答案 0 :(得分:8)

在查询中包含它们,如下所示:

SELECT * FROM MyTable
WHERE col1=@val1
And (Not Condition1 Or col2 = @val2)
And (Not Condition2 Or col3 = @val3)

所以,如果不是条件1(意思是:条件1为真)那么col2(必须)= @ val2。

(我将第二个条件逻辑更改为AND col3 = @ val3,因为您重复了AND col2 = @ val2

修改以回应评论: 给我一个条件1的标准的例子。在t-sql中的查询中未使用显式 if 语法。假设第一个重要标准,“之前的订单”必须小于20,并且。 。 。如果没有名字,第二个标准就是重要的。它是:

SELECT * FROM MyTable
WHERE col1=@val1
And (MyTable.OrderCount > 19 Or col2 = @val2)
And ((Not MyTable.FirstName Is Null) Or col3 = @val3)

不要以这种方式来考虑它“如果这种情况属实,这个标准很重要”。所有重要的因素都会进入where子句。您必须了解Or / And / Not和操作顺序。这需要练习才能变得更好。如果你需要思考几分钟,不要担心,有时我们其他人也会这样做。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

因此,如果condition1为true,它将评估col2 = @ val2,如果condition1为false,它将转到OR(condition2,并执行相同的操作。

答案 3 :(得分:1)

您需要阅读的两个非常重要的页面是:

以下内容涵盖SQL 2000和SQL 2005 http://www.sommarskog.se/dyn-search-2005.html

这个特定于SQL 2008。 http://www.sommarskog.se/dyn-search-2008.html

答案 4 :(得分: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 col1=@val1AND col2 = @val2


if condition2 here
  SELECT * FROM MyTable
  WHERE col1=@val1AND col3 = @val3

else
 SELECT * FROM MyTable
 WHERE col1=@val1

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

答案 5 :(得分: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))

编辑:好的,所以“conditionX AND”是多余的,但我认为这对于文档来说是一个好主意,因为它明确了构造的意图。

答案 6 :(得分:0)

这些天,人们对SQL一无所知......太棒了......

SELECT * 
FROM MyTable
WHERE col1=@val1 
and case when condition1 then col2 = @val2 else 1=1 end 
and case when condition2 then  col3 = @val3 else 1=1 end