SQL Server条件筛选
我基本上希望执行一个x=1和a=2的语句。如果是a2,则返回过滤器x=1的结果 我尝试了OR语句,但如果存在a等于2的情况,它会忽略我的a=2过滤器。下面的例子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
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)