在 SQL SELECT 语句中给出条件

3

我需要根据条件运行一个SQL查询。如果满足它们的if条件,那么有两个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。


这些答案有帮助吗? :) - Patrick Karcher
7个回答

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和操作顺序。这需要练习才能做得好。如果您需要花费几分钟来思考,不要担心,我们中的其他人有时也会这样。


谢谢...我不太擅长SQL语法,这可能听起来很傻,但我该如何在SQL中使用if语句代替我的condition1呢?SELECT * FROM MyTable WHERE col1=@val1 And (Not Condition1 Or col2 = @val2) And (Not Condition2 Or col3 = @val3) - ajithmanmu
我认为sargable是下一步。我们对条件了解不足,无法建议最佳策略,甚至不知道规模是否值得这样的努力。 - Patrick Karcher

2
假设条件可以被写成SQL表达式:
SELECT * FROM MyTable
WHERE col1=@val1 AND
(NOT(condition_1) OR col2 = @val2) AND
(NOT(condition_2) OR col3 = @val3) 

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

所以如果条件1为真,它将评估col2=@val2,如果条件1为假,则会转到OR(condition2,并执行相同的操作。


1

如果列不可为空(并且不要批评,试一下

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

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


1

0

我假设你的意思是要有两个不同的条件和列/值对,而不是像你在帖子中那样相同。

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

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

编辑:好的,所以“conditionX AND”是多余的,但我认为这对于文档记录来说是个好主意,因为它可以明确表达结构的目的。


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

当我尝试在 WHERE 子句中使用 CASE 语句时,性能表现非常糟糕。 - gbn
这就是为什么你需要逐个案例评估,对于小数据集(少于500k行)来说是可以的,但对于更大的数据集,我建议进行编程处理。但对于速度,它有助于解决快速问题,非常有用。 - MCoelho
现在很多人对SQL一无所知...令人惊讶... - secretwep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接