2013-04-24 9 views
24

Ho problemi con una query mysql. Voglio escludere i valori di 2. Così ho pensato che avrei fatto seguente:Sintassi di MYSQL che non è in grado di valutare in presenza di null

table products 

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

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

Tuttavia, questo non sta dando il risultato desiderato di prodotto1, prodotto 2 Si sta dando una tabella dei risultati vuoto.

D'altra parte se uso

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

Poi si produce: prodotto3. Ma voglio ottenere quei record dove non è uguale a 2.

Qualcosa non funziona con il <> '2'. Potrebbe essere che i valori NULL lo stiano buttando? Qualcuno può suggerire una soluzione. Grazie in anticipo!

+8

È possibile utilizzare l'operatore di uguaglianza 'NULL'-safe:' WHERE NOT backorder <=> 2' – eggyal

risposta

36

utilizzare IS NULL o IS NOT NULL per confrontare i valori NULL perché sono semplicemente sconosciuti.

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

Che ha funzionato. Segnerà correttamente quando SO mi consente. Una domanda ... alcuni record hanno il valore 1 in essi. Per consentire il caso in cui il valore è NULL o 1 dovrei essere in grado di fare qualcosa di simile (backorder IS NULL O backorder = '1'). Al momento non funziona per me. – user1904273

+0

come su questa demo? http://www.sqlfiddle.com/#!2/e0e57/2 –

+0

giusto per chiarire, vuoi ottenere sia 'NULL' che con valore di' 1'? –

-4

Provate questo e vedere.

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

Hai controllato questo? – user3115056

+0

No. Questo non funziona. Gli operatori '<>' e '! =' Sono equivalenti. Vedi http://stackoverflow.com/questions/2066987/using-the-correct-or-preferable-not-equal-operator-in-mysql –

6

dispiace per aprire questo

Possiamo usare anche questo

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

Questo non consente di aggiungere indici –

2

È possibile utilizzare:

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

o

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