SQL Server条件筛选

时间:2014-05-02 22:58:39

标签: sql sql-server where boolean-logic

我基本上想要执行一个声明,其中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 = 1Id = 2

时的预期结果
    Id(a)   Name    Person  Type(x)
    2        a       Mike    1

Type = 1Id <> 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这是否意味着案例陈述?

2 个答案:

答案 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')
  • 如果存在x = 1 a = 2的行,则需要
  • 如果没有更好的
  • ,你想要x = 1的行
  • 如果没有x = 1行
  • ,你什么也不想要

如果是这样,那就有点棘手了。您可以使用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)