Bagaimana cara memeriksa apakah kolom kosong atau nol di MySQL?

288

Saya memiliki kolom di tabel yang mungkin berisi nilai nol atau kosong. Bagaimana cara memeriksa apakah kolom kosong atau nol di baris yang ada di tabel?

(e.g. null or '' or '  ' or '      ' and ...)
priya
sumber
1
Kode MySQL: select isnull(mycolumn) from mytablemengembalikan 1 jika kolom saya nol.
Eric Leschinski
2
bagaimana dengan panjang (trim (kolom saya))> 0?
Cyril Jacquart
Untuk MSSQL> WHERE COLUM <> '' ATAU WHEN LEN (COLUMN)> 0 ATAU DI MANA NULLIF (LTRIM (RTRIM (COLUMN)), '') BUKAN NULL
DxTx

Jawaban:

444

Ini akan memilih semua baris mana some_coladalah NULLatau ''(string kosong)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
maček
sumber
7
Jika Anda mengubah kondisi menjadi WHERE some_col IS NULL OR some_col = ' '(satu spasi dimasukkan dalam string) maka itu berfungsi pada MySQL dan Oracle, lihat jawaban "onedaywhen". some_col = ''tidak berfungsi pada Oracle karena string kosong berarti NULL di sana.
Johanna
1
@Johanna tetapi jika Anda beralih ke ' ', maka itu tidak akan berfungsi di SQLite. Ini hanya menangani pencocokan string identik / langsung.
Magne
131

Seperti yang didefinisikan oleh SQL-92 Standard, ketika membandingkan dua string dengan lebar yang berbeda, nilai yang lebih sempit adalah benar-empuk dengan spasi untuk membuatnya sama lebar dengan nilai yang lebih luas. Oleh karena itu, semua nilai string yang seluruhnya terdiri dari spasi (termasuk spasi nol) akan dianggap sama, mis

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Oleh karena itu, ini harus berfungsi terlepas dari berapa banyak ruang membuat some_colnilai:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

atau lebih ringkas:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
suatu hari nanti
sumber
6
Terima kasih telah menyebutkan ruang yang empuk. Anda dapat mengambil untung dari mereka dan mengubah kondisinya menjadi WHERE some_col IS NULL OR some_col = ' '(satu ruang dimasukkan ke dalam string) kemudian bekerja pada MySQL dan Oracle. some_col = ''tidak berfungsi pada Oracle karena string kosong berarti NULL di sana dan kondisi lengkap menjadi NULL.
Johanna
Persyaratan saya adalah menemukan SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; dan SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;bekerja untuk saya di MySQL. Semoga ini bermanfaat.
Dinuka Dayarathna
Sebenarnya '' = ' 'bekerja di SQLServer tetapi tidak dalam SQLite, sejauh yang saya tahu, dari mengujinya sekarang.
Magne
66

Cara yang lebih singkat untuk menulis kondisi:

WHERE some_col > ''

Sejak null > ''diproduksi unknown, ini memiliki efek menyaring nullstring baik dan kosong.

Andomar
sumber
2
Apakah ada cara untuk mendapatkan kebalikan dari ini, mendapatkan semua catatan di mana NULL atau string kosong?
Joshua Pinter
14
@JoshPinter:coalesce(some_col, '') = ''
Andomar
6
Ini mungkin benar kadang-kadang, tetapi tidak berfungsi di MySQL 14.14.
Gunnar Þór Magnússon
berfungsi dengan baik dan pada kenyataannya satu-satunya cara saya bisa mengetahui cara memfilter bidang kosong dan kosong di MariaDB
Neal Davis
1
Saya menggunakan some_col <> '' untuk menemukan kebalikan dari ini
Chargnn
18

Anda dapat menguji apakah suatu kolom adalah nol atau bukan nol menggunakan WHERE col IS NULLatau WHERE col IS NOT NULLmisalnya

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

Dalam contoh Anda, Anda memiliki berbagai permutasi ruang putih. Anda dapat menghapus ruang putih menggunakan TRIMdan Anda dapat menggunakan COALESCEnilai NULL default (COALESCE akan mengembalikan nilai non-nol pertama dari nilai yang Anda berikan.

misalnya

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Kueri terakhir ini akan mengembalikan baris di mana MyColnol atau panjang spasi apa pun.

Jika Anda bisa menghindarinya, lebih baik tidak memiliki fungsi pada kolom di klausa WHERE karena itu membuat sulit untuk menggunakan indeks. Jika Anda hanya ingin memeriksa apakah kolomnya nol atau kosong, Anda sebaiknya melakukan ini:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Lihat TRIM COALESCE dan IS NULL untuk info lebih lanjut.

Juga Bekerja dengan nilai nol dari dokumen MySQL

Penyihir Kode
sumber
2
Anda menyajikan solusi nyata dengan cara yang sangat berbelit-belit. Pertama, Anda menyajikan solusi yang tidak lengkap untuk masalahnya "di mana mycol adalah nol". Kemudian Anda menyajikan solusi menggunakan dua fungsi bersarang di klausa mana, bahkan ketika mengatakan ini harus dihindari. Baru setelah itu Anda mendapatkan solusi nyata. Di masa depan, presentasikan solusi nyata Anda terlebih dahulu.
Kehilangan )sebelum =tanda pada contoh kedua Anda
Rorrim
15

Metode lain tanpa WHERE, coba ini ..

Akan memilih nilai Kosong dan NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
PodTech.io
sumber
ini mengembalikan 1 jika ada sesuatu yang nol, mengapa begitu?
noobie-php
NULLIF memeriksa fieldname untuk nilai kosong dan akan dikonversi ke NULL jika kosong. ISNULL mengembalikan 1 (benar) jika NULLIF berhasil mengubah bidang kosong menjadi NULL atau jika sudah NULL .... coba sendiri pada bidang nol dan kosong dalam tabel dengan dua fungsi pilih isnull (X) , pilih nullif (y)
PodTech.io
9

Antara

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

atau

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Reynante Daitol
sumber
6

Saya benci bidang yang berantakan di database saya. Jika kolomnya berupa string kosong atau nol, saya lebih suka memperbaikinya sebelum melakukan pemilihan setiap kali, seperti ini:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Ini membuat data tetap rapi, selama Anda tidak perlu membedakan antara NULL dan kosong karena alasan tertentu.

Keith Johnson
sumber
5

mencoba

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

atau

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Referensi

diEcho
sumber
5

Pernyataan ini jauh lebih bersih dan lebih mudah dibaca untuk saya:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Amaynut
sumber
4

Saat memeriksa null or Emptynilai untuk kolom di proyek saya, saya perhatikan bahwa ada beberapa masalah dukungan di berbagai Database.

Setiap Database tidak mendukung TRIM metode.

Di bawah ini adalah matriks hanya untuk memahami metode yang didukung oleh basis data yang berbeda.

Fungsi TRIM dalam SQL digunakan untuk menghapus awalan atau akhiran yang ditentukan dari string. Pola paling umum yang dihapus adalah spasi putih. Fungsi ini dipanggil secara berbeda di database yang berbeda:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Peramal: RTRIM(), LTRIM()
  • SQL Server: RTRIM(), LTRIM()

Cara Memeriksa Kosong / Null: -

Di bawah ini adalah dua cara berbeda menurut Database yang berbeda-

Sintaks untuk fungsi trim ini adalah:

  1. Gunakan Trim untuk memeriksa-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Gunakan LTRIM & RTRIM untuk memeriksa-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Di atas kedua cara memberikan hasil yang sama gunakan saja berdasarkan dukungan DataBase Anda. Itu hanya mengembalikan FirstNamedari UserDetailstabel jika memiliki yang kosongLastName

Berharap ini akan membantu Anda :)

Vikash Pandey
sumber
3

Jika Anda ingin agar nilai NULL disajikan terakhir saat melakukan ORDER BY, coba ini:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
Ghostman
sumber
3

Anda juga bisa melakukannya

SELECT * FROM table WHERE column_name LIKE ''

Makhluk yang terbalik

SELECT * FROM table WHERE column_name NOT LIKE ''
brenjt
sumber
Tampaknya tidak berfungsi: select NULL like ''mengembalikan NULL- setidaknya di MySQL.
Titus
2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Baltazar Moreno
sumber
Saya memiliki masalah membandingkan dengan bidang yang terkadang nol. Ini membantu:col1 != IFNULL(col2,'')
webaholik
1

Periksa nol

$column is null
isnull($column)

Periksa kosong

$column != ""

Namun, Anda harus selalu mengatur TIDAK NULL untuk kolom,
optimasi mysql hanya dapat menangani satu tingkat IS NULL

nyata
sumber
3
Tidak pernah menerima NULLnilai adalah keseluruhan topik untuk dibahas. Saya pikir itu tidak pantas untuk membuat rekomendasi itu tanpa memberikan alasan Anda.
maček
Saya memang termasuk, bersabarlah. Plus benar-benar membuat hidup sulit menggunakan NULL (seperti pertanyaan ini).
ajreal
5
Itu rekomendasi yang mengerikan. Pengaturan NOT NULL pada kolom yang nilainya mungkin tidak diketahui pada saat INSERT hanya berfungsi untuk mendorong penggunaan nilai "null" non-standar seperti -1dan ''.
Dan Bechard
@Dan jika Anda tidak yakin berapa nilainya selama penyisipan, Anda mungkin mengalami kesulitan untuk melakukan optimasi possilbe
ajreal
0
select * from table where length(RTRIM(LTRIM(column_name))) > 0
Hakan Ilgar
sumber
1
Apa gunanya menggunakan keduanya RTRIMdan LTRIM, tetapi tidak TRIM?
Nico Haase
0

Dalam kasus saya, spasi dimasukkan dalam kolom selama impor data dan meskipun tampak seperti kolom kosong panjangnya adalah 1. Jadi pertama-tama saya memeriksa panjang kolom yang tampak kosong menggunakan length(column)kemudian berdasarkan ini kita dapat menulis permintaan pencarian

SELECT * FROM TABLE WHERE PANJANG (KOLOM) = panjang kolom untuk kolom kosong

TUAN DAN
sumber
-1

coba ini jika datatype adalah string dan baris adalah nol

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

jika datatype int atau kolom 0 maka coba ini

SELECT * FROM table WHERE column_name > = 0
Monis Qureshi
sumber
-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
SaAy
sumber
1
Jawaban yang salah. Ini tidak akan memilih NULL.
Pang