Bagaimana cara memeriksa nilai null / kosong / spasi dengan satu tes?

88

Saya ingin menulis pernyataan SELECT yang hanya menggunakan satu pengujian untuk mengembalikan kolom tanpa nilai (null, kosong, atau semua spasi).

Saya pikir ini akan berhasil:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Tetapi ini tidak berfungsi untuk nilai NULL.

Tentu saja bisa saya tambahkan

OR column_name IS NULL

dan itu akan berhasil, tapi saya ingin cara yang menggunakan satu pengujian.

John Gordon
sumber
Apakah tidak diinginkan melakukan banyak tes? yaitu lebih perincian = umpan balik yang lebih baik kepada pengguna tentang cara mengoreksi data.
onedaywhen
@onedaywhen: Secara umum mungkin lebih baik untuk memiliki lebih banyak perincian, tetapi saya bekerja dengan basis kode yang ada dan saya ingin meniru struktur kode yang ada sedekat mungkin. Kode saat ini hanya melakukan satu pengujian, jadi saya mencari solusi yang juga hanya memiliki satu pengujian.
John Gordon

Jawaban:

101

Secara fungsional, Anda harus bisa menggunakan

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Masalahnya adalah indeks di COLUMN_NAME tidak akan digunakan. Anda harus memiliki indeks berbasis fungsi pada TRIM (nama_kolom) jika itu adalah kondisi selektif.

Gua Justin
sumber
32
Catatan untuk pengguna T-SQL: tidak ada TRIM, Anda memerlukan LTRIM atau RTRIM.
demoncodemonkey
11
Sejak SQL Server 2017 ada fungsi TRIM. Sumber
bvwidt
1
@ EhMann365 pertanyaan ini tentang Oracle, bukan Sql Server.
MH
11
RTRIM (LTRIM (nama_kolom)) - Untuk Pengguna SQL Microsft.
DxTx
4
Di Sql Server TRIM (nama_kolom) mengembalikan string kosong '', bukan NULL. Jawaban lain mendukung string kosong dan NULL
Michael Freidgeim
25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') akan mengembalikan '' jika nama_kolom adalah NULL, jika tidak maka akan mengembalikan nama_kolom.

MEMPERBARUI

Di Oracle, Anda dapat menggunakan NVLuntuk mencapai hasil yang sama.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''
GendoIkari
sumber
3
sebenarnya ini masih tidak berfungsi di Oracle, Oracle memperlakukan string kosong sebagai NULL sehingga Anda mungkin tidak memiliki klausa "tidak suka ''" karena ini membandingkan dengan nilai nol
Harrison
Bukankah saya ingin LIKE '' daripada NOT LIKE ''?
John Gordon
Ya, maaf, salah membaca pertanyaan awal karena menginginkan segala sesuatu yang memiliki nilai. Tapi seperti yang ditunjukkan oleh tanging, sepertinya ini tidak akan berhasil di Oracle.
GendoIkari
Karena saya menggunakan Oracle, sepertinya saya dapat menggunakan WHERE TRIM (col) IS NULL dan itu akan menangani nilai null, kosong, dan spasi.
John Gordon
Jelas, bagian pertama tidak ada tanda kurung, seharusnya:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan
15

Fungsi NULLIF akan mengubah nilai kolom apa pun dengan hanya spasi menjadi nilai NULL. Berfungsi untuk T-SQL dan SQL Server 2008 & lebih tinggi.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
MerrickPlainview
sumber
1
Jawaban yang baik akan berisi penjelasan tentang kode tersebut, dan mengapa ditulis dengan cara ini. Saya sarankan Anda memperbarui jawaban Anda :-)
Qirel
1
Apa gunanya ini? Akan lebih efisien jika hanya mengaturnya menjadi [nama_kolom] SEPERTI ''
SILENT
Perlu TRIM untuk mendukung banyak ruang putih
Michael Freidgeim
1
Pengujian di SQL Server 2017, ini berfungsi untuk beberapa spasi tanpa TRIM. Ini tidak masuk akal bagi saya, karena menurut dokumentasi NULLIF harus mengembalikan NULL hanya jika dua ekspresi sama, dan string spasi biasanya tidak sama dengan string kosong. (Saya hanya menguji spasi, bukan tab, baris baru, atau karakter spasi kosong lainnya.)
Jovie
1
@Jovie SQL Server terkadang mengabaikan spasi kosong, baca: stackoverflow.com/questions/17876478/…
Brian MacKay
7

Saat memeriksa null or Emptynilai suatu kolom, saya melihat bahwa ada beberapa masalah dukungan di berbagai Database.

Setiap Database tidak mendukung TRIM metode.

Di bawah ini adalah matriks untuk memahami metode yang didukung oleh database yang berbeda.

Fungsi TRIM di SQL digunakan untuk menghapus prefiks atau sufiks tertentu dari string. Pola paling umum yang dihilangkan adalah spasi putih. Fungsi ini disebut berbeda di database yang berbeda:

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

Cara Memeriksa Kosong / Null / Whitespace: -

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

Sintaks untuk fungsi trim ini adalah:

  1. Penggunaan Trim untuk memeriksa-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Penggunaan LTRIM & RTRIM untuk memeriksa-

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

Di atas kedua cara memberikan hasil yang sama, cukup gunakan berdasarkan dukungan DataBase Anda. Itu Hanya mengembalikan tabel FirstNamefrom UserDetailsjika ada yang kosongLastName

Berharap ini akan membantu orang lain juga :)

Vikash Pandey
sumber
DENGAN t sebagai (pilih '' c union semua pilih '' c union semua pilih NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; tidak mengembalikan 3 catatan di server SQL
Waqar
5
Mengapa L & RTRIM dibutuhkan? Bukankah hanya satu fungsi yang cukup untuk memeriksa apakah kolom kosong?
DIAM
4

Kueri phpMyAdmin ini mengembalikan baris-baris itu, yang BUKAN null atau kosong atau hanya spasi:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

jika Anda ingin memilih baris yang null / kosong / hanya spasi, hapus saja TIDAK.

Pilih
sumber
2

Gunakan kueri di bawah ini dan berhasil

SELECT column_name FROM table_name where isnull(column_name,'') <> ''
dvenkateshreddy
sumber
0

Apa yang saya gunakan IsNotNullOrEmptyOrWhiteSpacedi T-SQL adalah:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0
TiltonJH
sumber
0

Setiap orang menyarankan untuk menjalankan kueri di Oracle untuk menemukan catatan yang bidang spesifiknya kosong, (ini tidak termasuk (null) atau bidang lain hanya baris kosong) tidak berfungsi. Saya mencoba setiap kode yang disarankan. Sepertinya saya akan terus mencari secara online.

*****MEMPERBARUI*****

Saya mencoba ini dan berhasil, tidak yakin mengapa tidak akan berhasil jika <1 tetapi untuk beberapa alasan <2 bekerja dan hanya mengembalikan catatan yang bidangnya kosong

pilih [nama kolom] dari [nama tabel] di mana LENGTH (nama kolom) <2;

Saya menebak skrip apa pun yang digunakan untuk mengonversi data telah meninggalkan sesuatu di lapangan meskipun itu kosong, itulah tebakan saya mengapa <2 berfungsi tetapi tidak <1

Namun, jika Anda memiliki nilai lain di bidang kolom tersebut yang kurang dari dua karakter, maka Anda mungkin harus mencari solusi lain. Jika tidak banyak karakter lain, Anda dapat memilihnya.

Semoga solusi saya membantu orang lain di luar sana suatu hari nanti.

Wanita kucing
sumber
-3

Seperti di Oracle Anda dapat menggunakan fungsi NVL di MySQL Anda dapat menggunakan IFNULL (columnaName, newValue) untuk mencapai hasil yang Anda inginkan seperti dalam contoh ini

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
Marina Planells
sumber
-4

Kamu dapat memakai

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
gong15A
sumber