MySQL: memilih baris yang kolomnya nol


270

Saya mengalami masalah di mana ketika saya mencoba memilih baris yang memiliki NULL untuk kolom tertentu, ia mengembalikan set kosong. Namun, ketika saya melihat tabel di phpMyAdmin, ia mengatakan null untuk sebagian besar baris.

Kueri saya terlihat seperti ini:

SELECT pid FROM planets WHERE userid = NULL

Kosongkan setiap waktu.

Banyak tempat mengatakan untuk memastikan itu tidak disimpan sebagai "NULL" atau "null" bukan nilai yang sebenarnya, dan satu mengatakan untuk mencoba mencari hanya spasi ( userid = ' ') tetapi tidak ada yang berfungsi. Ada saran untuk tidak menggunakan MyISAM dan menggunakan innoDB karena MyISAM kesulitan menyimpan null. Saya beralih tabel ke innoDB tapi sekarang saya merasa masalahnya mungkin masih belum benar-benar nol karena cara mengubahnya. Saya ingin melakukan ini tanpa harus membuat ulang tabel sebagai innoDB atau yang lainnya, tetapi jika harus, saya pasti dapat mencobanya.


1
MyISAM tidak kesulitan menyimpan null. Semantik NULLs sendiri harus independen dari engine.
MarkR

Jawaban:


513

SQL NULL khusus, dan harus Anda lakukan WHERE field IS NULL, karena NULL tidak dapat sama dengan apa pun,

termasuk itu sendiri (yaitu: NULL = NULL selalu salah).

Lihat Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


25
Tidak Diketahui - Tidak salah. SQL menggunakan tiga logika yang dihargai.
Martin Smith

39
NULL = NULL tidak benar-benar SALAH - itu NULL lagi. Tapi itu tidak BENAR juga, jadi JIKA (NULL = NULL) tidak akan mengeksekusi.
Konerak

1
lihat juga @ jawabanobe: PILIH 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

Tidak hanya nol tidak sama dengan apa pun, juga tidak tidak sama dengan apa pun. Dengan kata lain, tidakselect * from foo where bar <> "abc" akan mengembalikan baris di mana bilah adalah nol. Itu membuat saya untuk loop hari ini. Docs memanggil operator "tidak sama dengan", tetapi sebenarnya itu "sama dengan sesuatu selain" operator. <>
StackOverthrow


39

Karena semua diberi jawaban, saya ingin menambahkan sedikit lagi. Saya juga menghadapi masalah yang sama.

Mengapa kueri Anda gagal? Kamu punya,

SELECT pid FROM planets WHERE userid = NULL;

Ini tidak akan memberi Anda hasil yang diharapkan, karena dari mysql doc

Dalam SQL, nilai NULL tidak pernah benar dibandingkan dengan nilai lain, bahkan NULL. Ekspresi yang berisi NULL selalu menghasilkan nilai NULL kecuali dinyatakan lain dalam dokumentasi untuk operator dan fungsi yang terlibat dalam ekspresi.

Tekankan milikku.

Untuk mencari nilai kolom NULL, Anda tidak dapat menggunakan expr = NULLtes. Pernyataan berikut tidak menghasilkan baris, karena expr = NULLtidak pernah benar untuk ekspresi apa pun

Larutan

SELECT pid FROM planets WHERE userid IS NULL; 

Untuk menguji NULL, gunakan IS NULLdan IS NOT NULLoperator.



11

Info dari http://w3schools.com/sql/sql_null_values.asp :

1) Nilai NULL menunjukkan data yang tidak diketahui hilang.

2) Secara default, kolom tabel dapat menyimpan nilai NULL.

3) Nilai NULL diperlakukan secara berbeda dari nilai lainnya

4) Tidak mungkin untuk membandingkan NULL dan 0; mereka tidak setara.

5) Tidak mungkin menguji nilai NULL dengan operator pembanding, seperti =, <, atau <>.

6) Kita harus menggunakan operator IS NULL dan IS NOT NULL sebagai gantinya

Jadi dalam kasus masalah Anda:

SELECT pid FROM planets WHERE userid IS NULL

7

Punya masalah yang sama di mana permintaan:

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

tidak mengembalikan nilai. Tampaknya ada masalah dengan MyISAM dan permintaan yang sama pada data di InnoDB menghasilkan hasil yang diharapkan.

Pergi bersama:

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

Mengembalikan semua hasil yang diharapkan.



0

Saya memiliki masalah yang sama ketika mengkonversi database dari Access ke MySQL (menggunakan vb.net untuk berkomunikasi dengan database).

Saya perlu menilai apakah bidang (tipe bidang varchar (1)) adalah nol.

Pernyataan ini berhasil untuk skenario saya:

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

1
Jika itu berhasil untuk Anda, default untuk varchar Anda (1) adalah '' daripada nol, oleh karena itu tidak terkait dengan pertanyaan ini.
さ り げ な い 告白
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.