Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menghitung semua nilai NULL dalam sebuah tabel?

Jika Anda ingin ini dilakukan secara eksklusif oleh MYSQL dan tanpa menghitung semua kolom, lihat solusi ini.

Dalam metode ini Anda tidak perlu mempertahankan jumlah kolom database dengan mengkodekannya secara keras. Jika skema tabel Anda akan dimodifikasi, metode ini akan berfungsi, dan tidak memerlukan perubahan kode.

SET @db = 'testing'; -- database
SET @tb = 'fuzzysearch'; -- table
SET @x = ''; -- will hold the column names with ASCII method applied to retrieve the number of the first char
SET @numcolumns = 0; -- will hold the number of columns in the table

-- figure out how many columns we have
SELECT count(*) into @numcolumns FROM information_schema.columns where [email protected] and [email protected];

-- we have to prepare some query from all columns of the table
SELECT group_concat(CONCAT('ASCII(',column_name,')') SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];
-- after this query we have a variable separated with comma like
-- ASCII(col1),ASCII(col2),ASCII(col3)

-- we now generate a query to concat the columns using comma as separator (null values are omitted from concat)
-- then figgure out how many times the comma is in that substring (this is done by using length(value)-length(replace(value,',',''))
-- the number returned is how many non null columns we have in that column
-- then we deduct the number from the known number of columns, calculated previously
-- the +1 is added because there is no comma for single value
SET @s = CONCAT('SELECT @numcolumns - (length(CONCAT_WS(\',\',', @x, '))-length(replace(CONCAT_WS(\',\',', @x, '),\',\',\'\')) + 1) FROM ',@db,'.',@tb,';');
PREPARE stmt FROM @s;
EXECUTE stmt;
-- after this execution we have returned for each row the number of null columns
-- I will leave to you to add a sum() group call if you want to find the null values for the whole table
DEALLOCATE PREPARE stmt;

ASCII digunakan untuk menghindari membaca, menggabungkan kolom yang sangat panjang tanpa alasan, juga ASCII membuat kita aman untuk nilai di mana karakter pertama adalah koma().

Karena Anda bekerja dengan laporan, Anda mungkin menemukan ini berguna karena ini dapat digunakan kembali untuk setiap tabel jika Anda memasukkan metode.

Saya mencoba memberikan komentar sebanyak mungkin.

Mari kita pecah berkeping-keping dengan cara kompak di atas (cara terbalik):

Saya ingin akhirnya memiliki pertanyaan seperti ini

SELECT totalcolumns - notnullcolumns from table; -- to return null columns for each row

Sedangkan yang pertama mudah dihitung dengan menjalankan:

SELECT count(*) FROM information_schema.columns where [email protected] and [email protected];

Yang kedua adalah kolom bukan null sedikit menyakitkan. Setelah pemeriksaan fungsi yang tersedia di MySQL, kami mendeteksi bahwa CONCAT_WS tidak CONCAT nilai nol

Jadi jalankan kueri seperti ini:

SELECT CONCAT_WS(",","First name",NULL,"Last Name");
returns: 'First name,Last Name'

Ini bagus, kami menghilangkan nilai nol dari enumerasi. Tapi bagaimana kami mendapatkan berapa banyak kolom yang sebenarnya digabungkan?

Nah itu rumit. Kita harus menghitung jumlah koma+1 untuk mendapatkan kolom gabungan yang sebenarnya.

Untuk trik ini kami menggunakan notasi SQL berikut

select length(value)-length(replace(value,',','')) +1 from table

Ok, jadi sekarang kita memiliki jumlah kolom gabungan.

Tetapi bagian yang lebih sulit akan datang selanjutnya.

Kita harus menghitung untuk CONCAT_WS() semua nilai.
Kita perlu memiliki sesuatu seperti ini:

SELECT CONCAT_WS(",",col1,col2,col3,col4,col5);

Di sinilah kita harus menggunakan pernyataan yang disiapkan, karena kita harus menyiapkan kueri SQL secara dinamis dari kolom yang belum diketahui. Kami tidak tahu berapa banyak kolom yang akan ada di tabel kami.

Jadi untuk ini kami menggunakan data dari tabel kolom information_schema. Kita perlu meneruskan nama tabel, tetapi juga nama database, karena kita mungkin memiliki nama tabel yang sama di database terpisah.

Kami membutuhkan kueri yang mengembalikan col1,col2,col3,col4,col5 kepada kami di "string" CONCAT_WS

Jadi untuk ini kami menjalankan kueri

SELECT group_concat(column_name SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];

Satu hal lagi untuk disebutkan. Saat kita menggunakan metode length() dan replace() untuk mengetahui berapa banyak kolom yang digabungkan, kita harus memastikan bahwa kita tidak memiliki koma di antara nilai-nilai tersebut. Tetapi perhatikan juga bahwa kita dapat memiliki nilai yang sangat panjang di sel database kita. Untuk kedua trik ini kita menggunakan metode ASCII('value'), yang akan mengembalikan char ASCII dari char pertama, yang tidak boleh koma dan akan mengembalikan null untuk kolom null.

Karena itu, kami dapat memadatkan semua ini dalam solusi komprehensif di atas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Load balancing dengan ProxySQL Untuk Percona XtraDB Cluster

  2. PDO mysql:Bagaimana cara mengetahui apakah penyisipan berhasil

  3. Mengapa penyisipan/pembaruan MySQL InnoDB pada tabel besar menjadi sangat lambat ketika ada beberapa indeks?

  4. Karakter non-Inggris yang disimpan, ada '?????' - Masalah Kumpulan Karakter MySQL

  5. Bagaimana cara Memeriksa apakah Tombol Radio Dicentang atau Dipilih di jQuery?