MySQL: bir sütunun boş olduğu satırları seçme


270

Belirli bir sütun için NULL olan satırları seçmeye çalıştığımda, boş bir küme döndürdüğü bir sorun yaşıyorum. Ancak, ben phpMyAdmin tabloya baktığınızda, satırların çoğu için null diyor.

Sorgum şöyle görünüyor:

SELECT pid FROM planets WHERE userid = NULL

Her seferinde boş set.

Birçok yer, gerçek bir değer yerine "NULL" veya "null" olarak kaydedilmediğinden emin olduğu söyleniyor ve biri sadece bir boşluk ( userid = ' ') aramaya çalıştığını söyledi ancak bunların hiçbiri işe yaramadı. MyISAM kullanmama ve innoDB kullanmamaya dair bir öneri vardı çünkü MyISAM null depolama konusunda sorun yaşıyor. Tabloyu innoDB'ye değiştirdim ama şimdi problemin dönüştürülebilme biçimi nedeniyle hala aslında boş olmaması olabilir gibi hissediyorum. Bunu innoDB veya başka bir şey olarak tabloyu yeniden oluşturmak zorunda kalmadan yapmak istiyorum, ama eğer gerekirse, bunu kesinlikle deneyebilirim.


1
MyISAM'ın null'u depolamakta zorlanmaması NULL'lerin kendileri semantiği motordan bağımsız olmalıdır.
MarkR

Yanıtlar:


513

SQL NULL özeldir ve yapmanız gerekir WHERE field IS NULL, çünkü NULL hiçbir şeye eşit olamaz,

kendisi dahil (yani: NULL = NULL her zaman yanlıştır).

Bkz. Rule 3 Https://en.wikipedia.org/wiki/Codd%27s_12_rules


25
Bilinmiyor - Yanlış değil. SQL üç değerli mantık kullanır.
Martin Smith

39
NULL = NULL gerçekten YANLIŞ değil - yine NULL. Ama bu da DOĞRU değil, bu nedenle EĞER (NULL = NULL) yürütülmez.
Konerak

1
ayrıca bkz. @ yanıt: SEÇ 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

Sadece boş bir şeye eşit değildir, aynı zamanda hiçbir şeye eşit değildir. Başka bir deyişle, select * from foo where bar <> "abc"olacak değil çubuğu boş olduğu satırları döndürür. Bu beni bugün bir döngü için attı. Dokümanlar <>"eşit değil" operatörünü çağırır , ancak gerçekten "operatör" dışında bir şeye eşittir.
StackOverthrow


39

Tüm cevaplar verildiğinden biraz daha eklemek istiyorum. Ben de aynı sorunla karşılaşmıştım.

Sorgunuz neden başarısız oldu? Var,

SELECT pid FROM planets WHERE userid = NULL;

Bu size beklenen sonucu vermeyecektir, çünkü mysql doc

SQL'de, NULL değeri, NULL olsa bile, diğer herhangi bir değerle karşılaştırıldığında asla doğru olmaz. NULL içeren bir ifade, ifadede yer alan işleçler ve işlevler için belgelerde aksi belirtilmedikçe her zaman NULL değeri üretir.

Vurgu madeni.

Sütun değerlerini aramak için NULLbir expr = NULLtest kullanamazsınız . Aşağıdaki ifade hiçbir satır döndürmez, çünkü expr = NULLherhangi bir ifade için asla doğru olmaz

Çözüm

SELECT pid FROM planets WHERE userid IS NULL; 

Test etmek için ve işleçlerini NULLkullanın .IS NULLIS NOT NULL



11

Alınan bilgiler http://w3schools.com/sql/sql_null_values.asp :

1) NULL değerler eksik bilinmeyen verileri temsil eder.

2) Varsayılan olarak, bir tablo sütunu NULL değerleri tutabilir.

3) NULL değerler diğer değerlerden farklı olarak ele alınır

4) NULL ve 0'ı karşılaştırmak mümkün değildir; eşdeğer değillerdir.

5) NULL değerlerin =, <veya <> gibi karşılaştırma işleçleriyle test edilmesi mümkün değildir.

6) Bunun yerine IS NULL ve IS NOT NULL operatörlerini kullanmamız gerekecek

Yani sorununuz olduğunda:

SELECT pid FROM planets WHERE userid IS NULL

7

Sorguda aynı sorunla karşılaştık:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

değer döndürmedi. MyISAM ile ilgili bir sorun gibi görünüyor ve InnoDB'deki verilerdeki aynı sorgu beklenen sonuçları döndürdü.

İle gitti:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Beklenen tüm sonuçları döndürdü.



0

Ben veritabanları Access MySQL (veritabanı ile iletişim kurmak için vb.net kullanarak) dönüştürürken aynı sorunu vardı.

Bir alanın (alan tipi varchar (1)) boş olup olmadığını değerlendirmem gerekiyordu.

Bu ifade benim senaryom için çalıştı:

SELECT * FROM [table name] WHERE [field name] = ''

1
Bu sizin için işe yaradıysa, varchar (1) için varsayılan değer null yerine '' şeklindedir, bu nedenle bu soru ile ilgisi yoktur.
08:24
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.