2014-10-01 59 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)