SQL Server条件筛选

SQL Server条件筛选,sql,sql-server,where,boolean-logic,Sql,Sql Server,Where,Boolean Logic,我基本上希望执行一个x=1和a=2的语句。如果是a2,则返回过滤器x=1的结果 我尝试了OR语句,但如果存在a等于2的情况,它会忽略我的a=2过滤器。下面的例子 select * from dbo.test where (x=1 and a=2) or x=1 用于以下输出目的:type=x,Id=a 类型=1时的预期结果 Id(a) Name Person Type(x) 2 a Mike 1 7 b

我基本上希望执行一个x=1和a=2的语句。如果是a2,则返回过滤器x=1的结果

我尝试了OR语句,但如果存在a等于2的情况,它会忽略我的a=2过滤器。下面的例子

select * 
from dbo.test
where (x=1 and a=2)
or
x=1
用于以下输出目的:type=x,Id=a

类型=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
类型为1且Id为2时的预期结果

类型=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为2时,它返回Type=1。这是否意味着一个案例陈述

select * 
from dbo.test
where (x=1 and a=2)
   or x=1
同:

select * 
from dbo.test
where x=1
并要求满足两个条件,或要求满足一个条件。a的值是不相关的

更新: 将秩函数与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,则仅返回该记录,否则将返回所有记录


演示:

我猜您想要返回一行

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)

你举的例子到底有什么问题?你能更清楚地阐述一下你目前得到的结果和你希望得到的结果吗?据我所知,这在逻辑上是不一致的。如果a=2,则也按x=1进行过滤,但如果a=2,则仅按x=1进行过滤。一点布尔代数表明A的值是无关的,在任何情况下,唯一的过滤器是x=1。“我说的对吗?”亚历杭德罗:对。示例语句是有效的SQL,因此这似乎更多地是关于基本布尔代数,而不是任何东西。因此,您要查询多个表,如果ID为2,您只需要ID为2,x为1,但如果没有ID=2,则返回x=1的所有记录?基本上是,我正在构建一个基于类型的层次结构,如果id=2不匹配,则需要保留type=1的结果。有更有效的方法可以做到这一点,x=1可以根据需要分解到WHERE子句中,但我怀疑这正是OP想要说的。但需要更多信息。更正a的值与此无关。如果a为2,我将如何编写语句使其具有相关性,同时返回x=1。a的值将如何使用?您已经返回了x=1的每个值,您希望发生什么?我希望x=1成为默认筛选器。但如果A=2,则返回A=2。如果a2返回x=1。@user3597889对不起,我很难理解。你想知道a=2还是x=1?是否要对结果进行排序,并优先选择A=2的位置?一些样本数据和期望的输出会有帮助。我知道我在解释它时遇到了困难:o。所以我有一个查询,其中x=1..始终。其中,当a=2时,返回x=1和a=2。如果是a2,则返回默认值x=1。
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)