2012-01-24 14 views
28

Mam bardzo proste zapytanie tak:zapytanie „nie równa się” nie działa

SELECT * FROM `all_conversations` WHERE `deleted_1` != '1'; 

A moja deleted_1 być domyślnym jest null lub jakiś identyfikator użytkownika, ale z jakiegoś powodu ta kwerenda zwraca zawsze mnie 0 rzędy , próbowałem też <>, ale wciąż nie ma szczęścia, co może być nie tak?

EDTI Więc po uruchomieniu więcej querys dowiem się, że moje problemy to wartość domyślna deleted_1 dziedzinie, było NULL więc zmodyfikowane moje zapytania i teraz działa dobrze:

SELECT * 
FROM `all_conversations` 
WHERE `deleted_1` != 'NULL' 
AND `deleted_1` != 23 
+1

Dlaczego 1 jest w cudzysłowach jak struna? –

+5

'WHERE \' deleted_1 \ '! = 'NULL'' Nie powinieneś tego robić. NULL jest wyjątkowy, spójrz na moją odpowiedź. – TimWolla

+0

@TimWolla dziękuję, zrobię to po swojemu. – Linas

Odpowiedz

65
SELECT * FROM all_conversations WHERE deleted_1 <> 1 OR deleted_1 IS NULL 

wartości NULL potrzebują specjalnego traktowania: http://dev.mysql.com/doc/refman/5.1/en/working-with-null.html

Sugerowałbym użyciu operatora diamentowe (<>) na rzecz != jako pierwsza jest ważna SQL a drugi jest dodanie MySQL.

+2

Proponuję użyć! = Ponieważ jest bardziej czytelny i używasz mysql, nie sql :). – Andrew

-2

Jak o usunięcie pojedyncze cytaty wokół 1?

SELECT * FROM `all_conversations` WHERE `deleted_1` != 1; 
+0

To była moja pierwsza myśl, ale http://dev.mysql.com/doc/refman/5.5/en/type-conversion.html wydaje się sugerować, że powinno to nastąpić automatycznie ... – ziesemer

+0

wciąż nic, na początku Myślałem, że to może być problem, że większość moich pól ma wartość zerową, ale nawet jeśli niektórzy mają numer, to wciąż niczego nie wybierają. – Linas

+0

Hmm, po uruchomieniu kilku kolejnych zapytań, w końcu zwróciło mi wiersze, w których "usunięty_1" nie jest "NULL", to naprawdę dziwne, ponieważ jestem pewien, że zanim nie zwrócił niczego, nawet jeśli było kilka liczb, więc domyślam się, że mój problem jest związany z tym polem domyślnie jest 'NULL' może powinienem ustawić go na 0 następnie – Linas

4

Możesz spróbować tego: deleted_1 is not null and deleted_1 != '1'?

mysql> select 0 is not null and 0 != '1', 1 is not null and 1 != '1', null is not null and null != '1'; 
+----------------------------+----------------------------+----------------------------------+ 
| 0 is not null and 0 != '1' | 1 is not null and 1 != '1' | null is not null and null != '1' | 
+----------------------------+----------------------------+----------------------------------+ 
|       1 |       0 |        0 | 
+----------------------------+----------------------------+----------------------------------+ 

Albo ten deleted_1 is null or deleted_1 != '1':

mysql> select 0 is null or 0 != '1', 1 is null or 1 != '1', null is null or null != '1'; 
+-----------------------+-----------------------+-----------------------------+ 
| 0 is null or 0 != '1' | 1 is null or 1 != '1' | null is null or null != '1' | 
+-----------------------+-----------------------+-----------------------------+ 
|      1 |      0 |       1 | 
+-----------------------+-----------------------+-----------------------------+ 

To naprawdę zależy od tego co chcesz wrócić.

2

Try This .. nadzieję, że będzie pracować dla Ciebie

SELECT * 
FROM `all_conversations` 
WHERE `deleted_1` IS NOT NULL 
AND `deleted_1` <> 23 
3

polecam użyć NULL-safe operatora i negację

SELECT * FROM `all_conversations` WHERE NOT(`deleted_1` <=> '1'); 
+0

Właśnie tego szukałem! – Gediminas

Powiązane problemy