2013-04-24 8 views
24

Mam problem z zapytaniem mysql. Chcę wykluczyć wartości 2. Tak myślałem, że chciałbym zrobić następujące:Składnia MYSQL nie jest równa nieobecności o wartości null

table products 

id | name  | backorder 
------------------- 
1 | product1 | NULL 
2 | product2 | NULL 
3 | product3 | 2 

SELECT name from `products` p 
WHERE backorder <> '2' 

Jednak to nie daje pożądanego rezultatu z Produkt1, produkt 2 Jest dając wyniki pusty stolik.

Z drugiej strony, jeśli mogę użyć

SELECT name from `products` p 
WHERE backorder = '2' 

Następnie produkuje: product3. Ale chcę uzyskać te zapisy tam, gdzie nie są one równe 2.

Coś nie działa z <> '2'. Czy to możliwe, że wartości NULL go zrzucają? Czy ktoś może zaproponować poprawkę? Z góry dziękuję!

+8

Ty może używać operatora bezpieczeństwa równego "NULL": 'WHERE NOT backorder <=> 2' – eggyal

Odpowiedz

36

użyć IS NULL lub IS NOT NULL do porównania wartości NULL, ponieważ są one po prostu nieznane.

SELECT name 
from products p 
WHERE backorder IS NULL OR backorder <> 2 
+0

To zadziałało. Oznaczę poprawnie, gdy SO pozwala mi. Jedno pytanie ... niektóre zapisy mają wartość 1 w nich. Aby umożliwić przypadek, w którym wartość ma wartość NULL lub 1, powinienem móc wykonać coś takiego (backorder IS NULL OR backorder = '1'). W tej chwili nie działa to dla mnie. – user1904273

+0

co z tym demo? http://www.sqlfiddle.com/#!2/e0e57/2 –

+0

tylko po to, aby wyjaśnić, czy chcesz uzyskać zarówno 'NULL' i wartość' 1'? –

-4

Spróbuj i zobacz.

SELECT name from `products` p 
WHERE backorder != '2' 
+0

Sprawdziłeś to? – user3115056

+0

Nie. To nie działa. Operatory '<>' i '! =' Są równoważne. Zobacz http://stackoverflow.com/questions/2066987/using-tcor-or-preferable-not-equal-operator-in-mysql –

6

Niestety, aby otworzyć ten

Możemy to wykorzystać również

SELECT name 
from products p 
WHERE COALESCE(backorder,1) <> 2 
+0

To łamie możliwość dodawania indeksów –

2

Można użyć:

SELECT `name` FROM `products` `p` 
WHERE NOT `backorder` <=> '2' 

lub

SELECT `name` FROM `products` `p` 
WHERE !(`backorder` <=> '2')