2016-03-29 9 views
1

Lütfen hızlı bir sorunuz var. MS erişiminde "NOT" ve "AND" birleştiren bir sorgu yazmaya çalışıyorum. Ama bir sebepten doğru sonucu elde edemiyorum. i bir tablo varsa Örneğin,:SQL'de "NOT" ve "AND" komutlarını birleştirmek (MS Access'e özel olarak)

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

Ne benim sorgudan istediğiniz 2. haricinde bu nedenle tüm kimlikleri b b değildir NAME1 ve isim 2'den her şeydir ama sadece kimliğini görebilir - 1 olan a.

Benim sorgu sadece herkes ben yanlış yapıyorum biliyor mu numarası 1.

döndürür

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

olduğunu. Teşekkür ederim.

SELECT * 
FROM TABLE Names 
WHERE (NZ(Name1, "") <> 'b') OR (NZ(Name2, "") <> 'b') 
+0

Ayrıca sonuçta 3 ve 4 kimliklerini de mi istiyorsunuz? ("üç değerli mantık" için google) – joop

cevap

1

kaçının Sadece DeMorgan yasalarını uygulayarak, eşitlik testini kullanarak bunu boş değerlere ing: NULL = 'x' yanlıştır ve NULL <> 'x' da yanlıştır: NULL değerlerle koşulların doğru sınamak asla:

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

fikirdir. (Hatta NULL = NULL yanlıştır!) Kısacası

: koşul (Name1 = 'b' AND Name2 = 'b')id=2 ile satır için sadece doğrudur; Bu duruma NOT uygulayarak tüm satırları EXCEPT id = 2 alırsınız.

+0

'NULL = 'x', Null değerini döndürür. NULL <> 'x', Null değerini döndürür. 'NULL = NULL' Null değerini döndürür. – HansUp

+0

... bu doğruyu değerlendirmiyor, benim durumumdu. – joop

0

Parantezleri <>

SELECT * 
FROM TABLE Names 
WHERE (Name1 <> 'b') OR (Name2 <> 'b') 
NOT üzerinde Sen almak için boş değerler zorlamak gerekebilir ayrı ayrı karşılaştırıldığında veya dize dönüştürülür:

SELECT * FROM TABLE Names WHERE NOT (Nz(Name1,'') = 'b') AND NOT (Nz(Name2,'') = 'b') 
0

Boş değerler olmalıdır: 3. ve 4. mantık bit terk etmekte yardımcı ve tercih

İlgili konular