MySQL memilih kolom mana yang tidak kosong

182

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.

mike
sumber
2
Bisakah Anda mengklarifikasi apa yang Anda maksud dengan " phone2ada sesuatu di dalamnya?" Orang yang mengambil tebakan, apakah Anda maksud phone2IS NOT NULL, tidak kosong, tidak eksklusif spasi, dll
Pilcrow
1
jika "sesuatu" ada, itu jelas bukan nol.
mike

Jawaban:

277

Bandingkan nilai phone2dengan string kosong:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Perhatikan bahwa NULLnilai ditafsirkan sebagai false.

Ivan Nevostruev
sumber
5
Kutipan tunggal, bukan tanda kutip ganda.
OMG Ponies
2
phone2<>""tidak akan berhasil melewati pemeriksa sintaks SQL apa pun.
OMG Ponies
5
@OMG Ponies: Tapi itu berfungsi di mysql. Ini adalah satu-satunya checker yang penting
Ivan Nevostruev
7
@ivan: Berita kepada saya, maaf tentang itu.
OMG Ponies
<> sama dengan! =. itu sederhana. tapi saya tidak tahu :)
MFarooqi
48

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

Stanislav Stoyanov
sumber
10
OP bertanya tentang hanya baris yang memiliki sesuatu di bidang phone2. IS NOT NULL mengembalikan semua yang secara harfiah tidak diatur ke NULL, bahkan string kosong "". ! = '', atau <> '' seperti yang dikatakan Ivan dalam jawaban yang diterima, tidak akan mengembalikan string kosong atau nilai NULL. Dengan kata lain IS NOT NULL adalah subset dari! = '', Tetapi mereka tidak setara.
Tidak ada
34

Periksa NULLdan kosongkan nilai string:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

NB Saya pikir COALESCE () adalah standar SQL (-ish), sedangkan ISNULL () tidak.

davek
sumber
1
Anda tidak perlu menggunakan fungsi trim, karena di MySQL string dari sejumlah ruang sama dengan string lain dari sejumlah ruang, saya telah menulis jawaban tentang ini di beberapa detail stackoverflow.com/a/ 42723975/728236
Brian Leishman
26

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

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

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 atas COALESCE()danIFNULL() fungsinya adalah ini ramah indeks, karena Anda tidak membandingkan output dari suatu fungsi pada bidang dengan apa pun.

Kasus uji:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

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.

Brian Leishman
sumber
17

Jika ada spasi di bidang phone2 dari entri data yang tidak sengaja, Anda bisa mengabaikan catatan tersebut dengan fungsi IFNULL dan TRIM:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';
micahwittman
sumber
Anda tidak perlu menggunakan fungsi trim, karena di MySQL string dari sejumlah ruang sama dengan string lain dari sejumlah ruang, saya telah menulis jawaban tentang ini di beberapa detail stackoverflow.com/a/ 42723975/728236
Brian Leishman
7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null
Klaus Byskov Pedersen
sumber
6
Perhatikan bahwa ada perbedaan antara NULLnilai dan string kosong ''yang merupakan nilai. Jika Anda ingin memeriksa string kosong, gunakan column <> ''seperti yang disarankan oleh jawaban lain.
Dzhuneyt
7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

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.

Satanicpuppy
sumber
Saya tidak akan menandai Anda tetapi: 1) Tidak ada NOT()fungsi di MySQL 2) phone2=""tidak akan berhasil melewati pemeriksa sintaks SQL.
OMG Ponies
1
Heh, maaf. Saya menggunakan banyak server SQL yang berbeda.
Satanicpuppy
2

Kita dapat menggunakan CASE untuk menetapkan nilai kosong ke beberapa karakter atau String. Saya menggunakan NA sebagai string Default.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'
Atul
sumber
2

Alternatif lain adalah dengan melihat secara khusus pada CHAR_LENGTHnilai kolom. (jangan dikacaukan dengan LENGTH)

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 0atau NULL. 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

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Tabel Data

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0Hasil (sama)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

Alternatif

phone2 <> ''Hasil (berbeda)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Hasil (berbeda)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Hasil (sama)
Catatan: hasil berbeda dari phone2 IS NOT NULL AND phone2 <> ''yang tidak diharapkan

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Hasil (berbeda)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0
fyrye
sumber
2

Anehnya (seperti tidak ada orang lain yang menyebutkannya sebelumnya) menemukan bahwa kondisi di bawah ini berfungsi:

WHERE ORD(field_to_check) > 0 

ketika kita perlu mengecualikan nilai nol dan kosong. Adakah yang menyadari kelemahan pendekatan ini?

Sergey Ch
sumber
Saya sudah mencoba selama berjam-jam untuk mendapatkan sintaks yang benar dan ini baru saja menyelesaikan semuanya terima kasih!
demo7up
1

Menggunakan:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL
OMG Ponies
sumber
1
Saya perhatikan bahwa kadang-kadang IS NOT NULLtidak diterapkan ke string hanya kolom dengan nilai kosong ( ''). Saya tidak tahu mengapa, tetapi hanya ingin menunjukkannya. Lebih bijak untuk digunakan t.phone2 <> ''saat memeriksa kolom string kosong.
Dzhuneyt
0

Anda dapat menggunakan wildcard operator seperti untuk mencapai ini:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

dengan cara ini, Anda bisa mendapatkan semua phone2 yang memiliki nomor awalan.

Panda
sumber
0

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.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Mohd Abdul Mujib
sumber