MySQL SELECT hanya bukan nilai null

264

Apakah mungkin untuk melakukan pernyataan pilih yang hanya mengambil nilai TIDAK NULL?

Saat ini saya menggunakan ini:

SELECT * FROM table

Dan kemudian saya harus menyaring nilai-nilai nol dengan loop php.

Apakah ada cara untuk melakukannya:

SELECT * (that are NOT NULL) FROM table

?

Saat ini ketika saya memilih * saya mendapatkan val1, val2, val3, null, val4, val5, null, null dll .... tapi saya hanya ingin mendapatkan nilai yang tidak nol dalam hasil saya. Apakah ini mungkin tanpa pemfilteran dengan loop?

bryan sammon
sumber
2
Apa yang Anda inginkan terjadi jika ada baris di mana beberapa kolom memiliki nilai NULL dan kolom lainnya tidak memiliki nilai NULL?
Mark Byers
Saya hanya ingin mendapatkan nilai dari kolom yang bukan nol, dan hanya mengembalikan nilai kolom di baris yang bukan nol. Saat ini saya menggunakan loop untuk menyaringnya, apakah mungkin melakukannya tanpa loop?
bryan sammon
1
@ Bryan - Apa struktur meja Anda? Apakah semua kolom memiliki tipe data yang sama?
Martin Smith
1
@ Bryan - Jadi, bagaimana hasil set ideal Anda nantinya? Kumpulan hasil satu kolom berisi semua nilai yang bukan nol? Jika tidak mengedit pertanyaan Anda dengan data contoh dan hasil yang diinginkan akan sangat membantu ...
Martin Smith
2
@ Bryan - Kedengarannya meja Anda mungkin memiliki grup berulang di kolom? (Lihat artikel Wiki untuk penjelasan dan struktur alternatif yang disarankan jika itu yang terjadi en.wikipedia.org/wiki/First_normal_form )
Martin Smith

Jawaban:

453

Anda harus menggunakan IS NOT NULL. (Operator perbandingan =dan <>keduanya memberi UNKNOWNdengan NULLdi kedua sisi ekspresi.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Hanya untuk kelengkapan saya akan menyebutkan bahwa di MySQL Anda juga dapat meniadakan operator kesetaraan nol yang aman tetapi ini bukan SQL standar.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Diedit untuk mencerminkan komentar. Sepertinya meja Anda mungkin tidak dalam bentuk normal pertama dalam hal mengubah struktur dapat membuat tugas Anda lebih mudah. Beberapa cara lain untuk melakukannya ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

Kerugian di atas adalah bahwa ia memindai tabel beberapa kali satu kali untuk setiap kolom. Itu mungkin bisa dihindari dengan di bawah ini tetapi saya belum menguji ini di MySQL.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/
Martin Smith
sumber
2
Terima kasih banyak .. Ini membantu :)
DfrDkn
Dalam pendekatan terakhir, Anda menggunakan CASEpernyataan, bukan CASEberfungsi. Jadi bukankah itu seharusnya END CASEbukan END di SELECT CASE ...bagian?
Istiaque Ahmed
Untuk orang yang tidak terlalu ahli, dapatkah Anda menjelaskan solusi terakhir? Apakah idx rom yang pertama SELECTberasal dari idxyang kedua SELECT? Apa yang CASEingin dicapai oleh pernyataan itu? Apa yang SELECTsebenarnya dilakukan oleh yang kedua ? Dan Anda melakukan join batin, bukan join silang, bukan?
Istiaque Ahmed
Saya tidak berpikir ini menjawab pertanyaan. Kedengarannya seperti OP ingin memilih (saya asumsikan satu baris tertentu) tetapi mengecualikan semua kolom dari hasil yang nol - jawaban ini mengharuskan Anda menentukan kolom mana yang tidak boleh nol (yang merupakan masalah yang sama sekali berbeda) atau tentukan semua kolom, tidak cocok untuk tabel dengan banyak kolom
csey
(mis. sesuatu di sepanjang baris SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey
18

Anda dapat memfilter baris yang berisi nilai NULL di kolom tertentu:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Jika Anda ingin memfilter baris yang berisi nol di kolom mana pun, coba ini:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Pembaruan: Berdasarkan komentar Anda, mungkin Anda menginginkan ini?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

Dan saya setuju dengan Martin bahwa jika Anda perlu melakukan ini maka Anda mungkin harus mengubah desain database Anda.

Mark Byers
sumber
Saya tidak yakin jika saya menjelaskannya dengan cukup baik, tetapi saya akan mencoba sedikit lebih baik. Saat ini ketika saya memilih * saya mendapatkan val1, val2, val3, null, val4, val5, null, null dll .... tapi saya hanya ingin mendapatkan nilai yang tidak nol dalam hasil saya. Apakah ini mungkin tanpa pemfilteran dengan loop?
bryan sammon
@ Bryan - Bisakah Anda menjelaskan kolom apa yang *kembali? Mungkin berikan sedikit contoh data dalam pertanyaan Anda karena tidak jelas dari komentar Anda di atas apakah ini semua satu kolom.
Martin Smith
Saat ini, * mengembalikan semua nilai saya di baris. yaitu val1, val2, val3, null, val4, val5, null, null. Tapi saya ingin hanya mengembalikan nilai kolom yang bukan nol. Sekarang saya melakukannya dengan loop untuk menyaring nilai setelah mengembalikan hasilnya.
bryan sammon
13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Satu-satunya kelemahan dari pendekatan ini adalah Anda hanya dapat membandingkan 5 kolom, setelah itu hasilnya akan selalu salah, jadi saya bandingkan hanya bidang yang bisa NULL.

Alan Chavez
sumber
8

Saya menemukan solusi ini:

Kueri ini pilih yang terakhir bukan nilai nol untuk setiap kolom.

Contoh


Jika Anda punya meja:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

Anda mendapatkan:

title|body
t3   |b2

Pertanyaan


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

Saya harap membantu Anda.

porquero
sumber
GROUP_CONCAT (badan) SEBAGAI badan
Ravindra Singh
2

Saya menggunakan \!perintah di dalam MySQL untuk mengeluarkan nilai NULL dari shell:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

Ini bekerja paling baik dengan tepat di .my.cnfmana basis data / nama pengguna / kata sandi Anda ditentukan. Dengan begitu Anda hanya perlu mengelilingi dan selectdengan Anda .\! mysql e| grep -v NULL

jiwaku
sumber
1

Permintaan berikut berfungsi untuk saya

ketika saya telah menetapkan nilai default kolom 'NULL' lalu

select * from table where column IS NOT NULL

dan ketika saya telah menetapkan nilai default, maka tidak ada

select * from table where column <>''
Basant
sumber
0

Ya gunakan NOT NULLdalam permintaan Anda seperti ini di bawah ini.

SELECT * 
FROM table
WHERE col IS NOT NULL;
Jonathan Vasiliou
sumber
0

MYSQL BUKANLENGKAP DENGAN GABUNGAN DAN PILIH, INSERT KE, HAPUS & OPERATOR LOGIS SEPERTI ATAU, BUKAN

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;
Pengembang
sumber
-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';
Venkat Kallem
sumber
2
Ini bukan pilih mana yang kosong. pertanyaannya adalah untuk memilih bukan nilai
krishna