我需要根据条件运行一个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。
我需要根据条件运行一个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。
在查询中加入它们,就像这样:
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和操作顺序。这需要练习才能做得好。如果您需要花费几分钟来思考,不要担心,我们中的其他人有时也会这样。
SELECT * FROM MyTable
WHERE col1=@val1 AND
(NOT(condition_1) OR col2 = @val2) AND
(NOT(condition_2) OR col3 = @val3)
SELECT * FROM MyTable
WHERE col1=@val1 AND ((condition1 AND col2=@val2) OR (condition2 AND col2=@val2))
所以如果条件1为真,它将评估col2=@val2,如果条件1为假,则会转到OR(condition2,并执行相同的操作。
如果列不可为空(并且不要批评,试一下)
SELECT
*
FROM
MyTable
WHERE
col1 = @val1 AND
col2 = ISNULL(@val2, col2) AND
col3 = ISNULL(@val2, col3)
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
或使用其他提供的解决方案
你需要阅读的两个非常重要的页面是:
以下内容涵盖了SQL 2000和SQL 2005 http://www.sommarskog.se/dyn-search-2005.html
这一个专门针对SQL 2008。 http://www.sommarskog.se/dyn-search-2008.html
我假设你的意思是要有两个不同的条件和列/值对,而不是像你在帖子中那样相同。
如果“条件”是查询上下文中存在的东西(即不是外部因素),那么你可以这样做:
SELECT * FROM MyTable
WHERE col1 = @val1
AND (NOT condition1 OR (condition1 AND col2 = @val2))
AND (NOT condition2 OR (condition2 AND col3 = @val3))
编辑:好的,所以“conditionX AND”是多余的,但我认为这对于文档记录来说是个好主意,因为它可以明确表达结构的目的。
现在很多人对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