Di MySQL, bisakah saya memilih kolom hanya di mana ada sesuatu?
Misalnya, saya memiliki pertanyaan berikut:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
Saya mencoba untuk memilih hanya baris di mana telepon dimulai dengan 813 dan phone2 memiliki sesuatu di dalamnya.
phone2
ada sesuatu di dalamnya?" Orang yang mengambil tebakan, apakah Anda maksudphone2
IS NOT NULL, tidak kosong, tidak eksklusif spasi, dllJawaban:
Bandingkan nilai
phone2
dengan string kosong:Perhatikan bahwa
NULL
nilai ditafsirkan sebagaifalse
.sumber
phone2<>""
tidak akan berhasil melewati pemeriksa sintaks SQL apa pun.Untuk memeriksa apakah bidang NULL digunakan
IS NULL
,IS NOT NULL
operator.Referensi MySql http://dev.mysql.com/doc/refman/5.0/id/working-with-null.html
sumber
Periksa
NULL
dan kosongkan nilai string:NB Saya pikir COALESCE () adalah standar SQL (-ish), sedangkan ISNULL () tidak.
sumber
Sebuah jawaban yang telah saya gunakan yang telah bekerja dengan baik untuk saya yang belum saya lihat di sini (pertanyaan ini sudah sangat lama, jadi mungkin belum berfungsi) sebenarnya
Perhatikan
> ''
bagian tersebut, yang akan memeriksa apakah nilainya tidak nol, dan jika nilainya bukan hanya spasi kosong atau kosong.Pada dasarnya, jika bidang memiliki sesuatu di dalamnya selain spasi atau
NULL
, itu benar. Ini juga sangat pendek, jadi mudah untuk menulis, dan nilai tambah lainnya di atasCOALESCE()
danIFNULL()
fungsinya adalah ini ramah indeks, karena Anda tidak membandingkan output dari suatu fungsi pada bidang dengan apa pun.Kasus uji:
UPDATE Ada peringatan untuk ini yang saya tidak harapkan, tetapi nilai numerik yang nol atau di bawah tidak lebih besar dari string kosong, jadi jika Anda berurusan dengan angka yang bisa nol atau negatif maka JANGAN LAKUKAN INI , itu menggigit saya baru-baru ini dan sangat sulit untuk men-debug :(
Jika Anda menggunakan string (char, varchar, teks, dll.), Maka ini akan baik-baik saja, hati-hati dengan angka.
sumber
Jika ada spasi di bidang phone2 dari entri data yang tidak sengaja, Anda bisa mengabaikan catatan tersebut dengan fungsi IFNULL dan TRIM:
sumber
sumber
NULL
nilai dan string kosong''
yang merupakan nilai. Jika Anda ingin memeriksa string kosong, gunakancolumn <> ''
seperti yang disarankan oleh jawaban lain.Mungkin perlu beberapa penyesuaian tergantung pada apa nilai default Anda. Jika Anda mengizinkan Null mengisi, maka Anda bisa melakukan "Bukan NULL", yang jelas lebih baik.
sumber
NOT()
fungsi di MySQL 2)phone2=""
tidak akan berhasil melewati pemeriksa sintaks SQL.Kita dapat menggunakan CASE untuk menetapkan nilai kosong ke beberapa karakter atau String. Saya menggunakan NA sebagai string Default.
sumber
Alternatif lain adalah dengan melihat secara khusus pada
CHAR_LENGTH
nilai kolom. (jangan dikacaukan denganLENGTH
)Menggunakan kriteria di mana panjang karakter lebih besar dari 0, akan menghindari positif palsu ketika nilai kolom bisa palsu, seperti dalam hal kolom bilangan bulat dengan nilai
0
atauNULL
. Berperilaku lebih konsisten di berbagai tipe data.Yang menghasilkan nilai apa pun yang panjangnya minimal 1 karakter, atau sebaliknya tidak kosong.
Contoh https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1
Tabel Data
CHAR_LENGTH(phone2) > 0
Hasil (sama)Alternatif
phone2 <> ''
Hasil (berbeda)phone2 > ''
Hasil (berbeda)COALESCE(phone2, '') <> ''
Hasil (sama)Catatan: hasil berbeda dari
phone2 IS NOT NULL AND phone2 <> ''
yang tidak diharapkanphone2 IS NOT NULL AND phone2 <> ''
Hasil (berbeda)sumber
Anehnya (seperti tidak ada orang lain yang menyebutkannya sebelumnya) menemukan bahwa kondisi di bawah ini berfungsi:
ketika kita perlu mengecualikan nilai nol dan kosong. Adakah yang menyadari kelemahan pendekatan ini?
sumber
Menggunakan:
sumber
IS NOT NULL
tidak diterapkan ke string hanya kolom dengan nilai kosong (''
). Saya tidak tahu mengapa, tetapi hanya ingin menunjukkannya. Lebih bijak untuk digunakant.phone2 <> ''
saat memeriksa kolom string kosong.Anda dapat menggunakan wildcard operator seperti untuk mencapai ini:
dengan cara ini, Anda bisa mendapatkan semua phone2 yang memiliki nomor awalan.
sumber
Dalam kasus saya, saya memiliki kolom varchar, kedua metode
IS NOT NULL
&!= ''
tidak bekerja , tetapi berikut ini bekerja untuk saya. Hanya menempatkan ini di sini.sumber