2017-10-16 5 views
1

Ich habe unter Tabelle in MySQL.Unerwarteter Vergleich NULL Vergleich in MySQL

city_data 
+------+-----------+-------------+ 
| id | city_code | city_name | 
+------+-----------+-------------+ 
| 4830 | BHR  | Bharatpur | 
| 4831 | KEP  | Nepalgunj | 
| 4833 | OHS  | Sohar  | 
| 4834 | NULL  | Shirdi  | 
+------+-----------+-------------+ 

und unter Abfrage.

ID, city_code, city_name aus city_data where city_code! = 'BHR';

Ich hatte 3 Zeilen erwartet.

| 4831 | KEP  | Nepalgunj | 
| 4833 | OHS  | Sohar  | 
| 4834 | NULL  | Shirdi  | 
+------+-----------+-------------+ 

Aber bekommen nur 2 Zeilen.

| 4831 | KEP  | Nepalgunj | 
| 4833 | OHS  | Sohar  | 
+------+-----------+-------------+ 

Ich bin nicht in der Lage zu verstehen, warum die Reihe

| 4834 | NULL  | Shirdi  | 

Nicht im Ergebnis meiner Abfrage enthält. Die Where-Bedingung (NULL! = 'BHR') hätte übergeben werden sollen.

Bitte, jemand, helfen, den Zweifel zu beseitigen.

+1

'wählen ID, Stadt_Code, Stadt_Name von Stadt_Daten wo COALESCE (Stadt_Kode, '- 1')! = 'BHR';' – lad2025

Antwort

1

MySQL Reference Manual, section 3.3.4.6: Working with NULL values nach dem folgenden Grund:

Da das Ergebnis eines arithmetischen Vergleich mit NULL ist auch NULL, Sie können keine aussagekräftigen Ergebnisse von solchen Vergleichen erhalten.

In MySQL, 0 oder NULL bedeutet falsch und alles andere bedeutet wahr. Der Standardwahrheitswert aus einem Booleschen Operation 1.

Das bedeutet, dass NULL != 'BHR'-NULL bewerten wird, was wiederum false zu MySQL bedeutet. Damit die Abfrage wie gewünscht funktioniert, müssen Sie OR city_code IS NULL an Ihre Abfrage anhängen.

+0

Ja. ** Das Ergebnis eines arithmetischen Vergleichs mit NULL ist ebenfalls NULL. ** erklärt alles. – shubham12511

0

Sie keine Nullwerte mit != vergleichen kann, weil es null ist, verwenden IS NULL Prädikat statt:

select id,city_code,city_name 
from city_data 
where city_code != 'BHR' OR city_code IS NULL; 
+0

Sie möchten nicht COALESCE? Schneller! – Hogan

0

Es ist nicht möglich, mit Vergleichsoperatoren wie =, < oder <> auf NULL-Werte zu prüfen. Daher ist die Abfrage verwirrend und der NULL-Datensatz wird ignoriert. Weitere Informationen finden Sie unter https://www.w3schools.com/sql/sql_null_values.asp