2014-10-01 65 views
0

我想对返回列值的表执行Select查询,如果至少所有必需的“X”选项都经过验证,即使最后还有更多选项。SQL Server:非严格的WHERE查询

NAME | A | B | C | D | E | 
------------------------------------ 
BOB   X  X  X 
TOM  X  X  X 
WILL    X  X  X 

例如:BOB需要至少有选项B,C和D才有效。如果至少B,C和D是真的,无论E或A的值是什么(甚至是True),我都希望查询返回BOB。 B = true,C = true,D = true和A = true的查询也应返回BOB。

所以像

Select 
    Name 
From 
    Table 
Where 
    A = True and B = True and C = True and D = True 

查询返回BOB(因为B,C和d是真实的),以及TOM(因为A,B和C是真实的),但没有意志,因为它需要E =真正。

你有什么想法吗?

感谢

+11

看看表。看看你的逻辑。他们不匹配。 – 2014-10-01 02:46:06

+0

试试这个where子句。 '在哪里(A =真或B =真或C =真或D =真)而不是E =真' – Sathish 2014-10-01 04:45:27

+0

你想只检查前3列值?像A,B,C或B,C,D或C,D,E。 – Mukund 2014-10-01 04:48:35

回答

0

所以,基本上你需要评估三个不同的条件,如果它的任何一个为真时选择的名称。

下面是该查询,从被提供了什么(变化表名和在where子句中的“真”)

Select 
    Name 
From 
    Table 
Where 
    (B = True and C = True and D = True) 
    or (A = True and B = True and C = True) 
    or (C = True and D = True and E = True) 
+0

感谢您的意见。我不能使用'或',因为在这个例子中BOB需要选项A和B和C,我不介意其他列的值(假是真的)。我的例子很简单,但真正的问题是一个更大的表格(10列,20行)。我的输入是变量,基本上它是一组可用选项(A,B,C,D,E),我需要知道基于表的输入选项集满足哪个名称。输入可以是3(A,B,C或A,C,D或....)或更多。 – Romain 2014-10-01 06:25:56

+0

在现实生活中,我不知道我有多少输入,它是1到20个值的组合。 – Romain 2014-10-01 06:33:09

0

感谢您的意见! 是的Damien我认为关系部门可能会有所帮助。 也许我可以改变一个位以2个表中的结构:

1表,列出为有效需要为每个用户的选项: t_name

Name | Opt1 | opt2 | opt3 | opt4| 
================================ 
BOB | B | C | D |  | 
--------------------------------- 
TOM | A | B | C |  | 
--------------------------------- 
WILL | C | D | E |  | 
--------------------------------- 

一个表可以由真或假来更新这取决于如果选项是为发送或者paramtre不,如果选项被送到它的价值是真实的(所以这个表必须由每个请求更新列出可用的选项)

t_option

Option | Status| 
================ 
A  | True | 
---------------- 
B  | True | 
---------------- 
C  | True | 
---------------- 
D  | True | 
---------------- 
E  | false| 
---------------- 

所以查询可这样的事情:

SELECT name FROM t_name 
WHERE opt1 IN (SELECT option FROM t_option WHERE status=True) 
AND opt2 IN (SELECT option FROM t_option WHERE status=True) 
AND opt3 IN (SELECT option FROM t_option WHERE status=True) 
AND opt4 IN (SELECT option FROM t_option WHERE status=True) 

,但我必须要肯定选择不为空(在本例中OPT4为null)