2016-03-29 7 views
1

私はすぐに質問してください。私は、MSアクセスで "NOT"と "AND"を組み合わせたクエリを作成しようとしています。しかし何らかの理由で私は正しい結果を得ていません。私はテーブルを持っている場合たとえば、:SQLで「NOT」と「AND」を組み合わせる(具体的にはMS Access)

ID| Name1| Name2| 
1 | a | a | 
2 | b | b | 
3 | a |  | 
4 |  | a | 
5 | a | b | 
6 | b | a | 

は何私は私のクエリから欲しいのはBではない名前1、名前2に至るまで、Bので、2を除くすべてのIDですが、私は唯一のIDを見ることができます - 1はa、aです。

私のクエリは、誰もが私が間違っているのか知っているんだけID 1.

を返し

SELECT * FROM TABLE Names 
WHERE NOT Name1 = 'b' AND NOT Name2 = 'b' 

です。ありがとうございました。ロジックのビットを破る助け、そしてあなたが3と4を取得するにはnull値を強制しなければならない場合があり<>

NOTオーバー
SELECT * 
FROM TABLE Names 
WHERE (Name1 <> 'b') OR (Name2 <> 'b') 

を好む

+0

結果にids 3と4も必要ですか? (google for "three valued logic") – joop

答えて

1

回避する唯一ドモルガンの法則を適用し、平等のテストを使用してNULLをINGの:NULL = 'x'がfalseで、かつNULL <> 'x'も偽です:NULL値の条件が真のテストはありません:

SELECT * 
FROM Names 
WHERE NOT (Name1 = 'b' AND Name2 = 'b') 
; 

アイデアがあります。 (NULL = NULLでも偽です)

簡潔に言えば、条件(Name1 = 'b' AND Name2 = 'b')は、id=2の行にのみ該当します。この条件にNOTを適用すると、id = 2以外のすべての行が得られます。

+0

'NULL = 'x''はNULLを返します。 'NULL <> 'x''はNullを返します。 'NULL = NULL'はNullを返します。 – HansUp

+0

...それは私の場合だったと評価されません。 – joop

0

使用括弧:

NULL値があるべき
SELECT * 
FROM TABLE Names 
WHERE (NZ(Name1, "") <> 'b') OR (NZ(Name2, "") <> 'b') 
0

別々に比較するか、文字列に変換する:

SELECT * FROM TABLE Names WHERE NOT (Nz(Name1,'') = 'b') AND NOT (Nz(Name2,'') = 'b') 
関連する問題