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 ...)

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 = '';

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;

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.


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


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

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

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.


5

mencoba

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

-> 0, 0, 1

atau

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

Referensi


5

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

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

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 :)


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;

3

Anda juga bisa melakukannya

SELECT * FROM table WHERE column_name LIKE ''

Makhluk yang terbalik

SELECT * FROM table WHERE column_name NOT LIKE ''

Tampaknya tidak berfungsi: select NULL like ''mengembalikan NULL- setidaknya di MySQL.
Titus

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

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


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

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


-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

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Jawaban yang salah. Ini tidak akan memilih NULL.
Pang
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.