我基本上想要执行一个声明,其中x = 1 AND a = 2。如果<> 2则返回过滤器x = 1的结果。
我已尝试过OR语句,但是如果有一个等于2的情况,它会忽略我的a = 2过滤器。
select *
from dbo.test
where (x=1 and a=2)
or
x=1
出于以下输出目的:type = x和Id = a
Type = 1时的预期结果。
Id(a) Name Person Type(x)
2 a Mike 1
7 b Jim 1
3 c Tom 1
4 d Tim 1
5 e Dave 1
Type = 1
和Id = 2
Id(a) Name Person Type(x)
2 a Mike 1
Type = 1
和Id <> 2
时的预期结果(Id列中没有'2'的情况)
Id(a) Name Person Type(x)
8 a Mike 1
7 b Jim 1
3 c Tom 1
4 d Tim 1
5 e Dave 1
问题不在Id = 2
时。当Id&lt;&gt;时,它返回Type = 1
这是否意味着案例陈述?
答案 0 :(得分:2)
select *
from dbo.test
where (x=1 and a=2)
or x=1
与:
相同select *
from dbo.test
where x=1
AND
要求同时满足这两个条件,OR
要求满足一个条件。 a
的值无关紧要。
更新:
将RANK()
函数与CASE
语句结合使用后,您可以获得所需内容:
;WITH cte AS (SELECT *,RANK() OVER(ORDER BY CASE WHEN id = 2 THEN 1 ELSE 2 END)RNK
FROM Table1
WHERE Type = 1)
SELECT *
FROM cte
WHERE RNK = 1
如果表中存在id = 2,则只返回该记录,否则将返回所有记录。
演示:SQL Fiddle
答案 1 :(得分:0)
我猜你想要返回一行。
insert into test(x,a,v) values (0, 0, 'No good')
insert into test(x,a,v) values (1, 0, 'OK')
insert into test(x,a,v) values (1, 2, 'Better')
如果是这样,那就有点棘手了。您可以使用CASE语句对行进行评分,然后选择具有最佳值的行。如果存在平局,这可能会给你多行。
SELECT v
FROM test
WHERE CASE WHEN x=1 AND a=2 THEN 1000
WHEN x=1 AND a<>2 THEN 100
ELSE 0 END =
(SELECT MAX(CASE WHEN x=1 AND a=2 THEN 1000
WHEN x=1 AND a<>2 THEN 100
ELSE 0 END)
FROM test)