Beberapa Solusi untuk: beberapa nol, semua nol, satu & beberapa kolom ditambah menjadikannya CEPAT menggunakan Top 1
Jika Anda perlu menguji beberapa kolom, Anda dapat menggunakan yang berikut:
Column_1 Column_2 Column_3
-------- -------- --------
1 2 NULL
1 NULL NULL
5 6 NULL
Pertama , uji NULL dan hitung:
select
sum(case when Column_1 is null then 1 else 0 end) as Column_1,
sum(case when Column_2 is null then 1 else 0 end) as Column_2,
sum(case when Column_3 is null then 1 else 0 end) as Column_3,
from TestTable
Menghasilkan hitungan NULLs:
Column_1 Column_2 Column_3
0 1 3
Di mana hasilnya adalah 0, tidak ada NULL.
Kedua , mari kita hitung non-NULL:
select
sum(case when Column_1 is null then 0 else 1 end) as Column_1,
sum(case when Column_2 is null then 0 else 1 end) as Column_2,
sum(case when Column_3 is null then 0 else 1 end) as Column_3,
from TestTable
... Tetapi karena kami menghitung non-NULL di sini, ini dapat disederhanakan menjadi:
select
count(Column_1) as Column_1,
count(Column_2) as Column_2,
count(Column_3) as Column_3,
from TestTable
Salah satu hasil:
Column_1 Column_2 Column_3
3 2 0
Di mana hasilnya adalah 0, kolom seluruhnya terdiri dari NULL.
Terakhir , jika Anda hanya perlu memeriksa kolom tertentu, maka TOP 1 lebih cepat karena harus berhenti pada klik pertama. Anda kemudian dapat secara opsional menggunakan count (*) untuk memberikan hasil gaya boolean:
select top 1 'There is at least one NULL' from TestTable where Column_3 is NULL
select count(*) from (select top 1 'There is at least one NULL' AS note from TestTable where Column_3 is NULL) a
0 = Tidak ada NULL, 1 = Setidaknya ada satu NULL
atau
select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL
select count(*) from (select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL) a
0 = Semuanya NULL, 1 = Setidaknya ada satu NULL
Saya harap ini membantu.
UNPIVOT menerjemahkan kolom menjadi baris. Dalam prosesnya menghilangkan nilai NULL ( referensi ).
Diberikan input
permintaan UNPIVOT
akan menghasilkan output
Sayangnya baris 4 telah dihilangkan seluruhnya karena hanya memiliki NULL! Itu dapat dengan mudah diperkenalkan kembali dengan menyuntikkan nilai dummy ke dalam kueri sumber:
Dengan menjumlahkan baris pada ID kita dapat menghitung nilai-nilai yang bukan nol. Perbandingan dengan jumlah total kolom dalam tabel sumber akan mengidentifikasi baris yang berisi satu atau lebih NULL.
Saya menghitung 3 sebagai
jumlah kolom dalam tabel sumber #t
+ 1 untuk kolom dummy yang disuntikkan
- 1 untuk ID, yang tidak UNPIVOTED
Nilai ini dapat diperoleh saat runtime dengan memeriksa tabel katalog.
Baris asli dapat diambil dengan bergabung ke hasilnya.
Jika nilai selain NULL ingin diselidiki, nilai itu dapat dimasukkan dalam klausa where:
Diskusi
Ini membutuhkan pengenal yang dilakukan melalui UNPIVOT. Kunci akan menjadi yang terbaik. Jika tidak ada, dapat disuntikkan oleh ROW_NUMBER () fungsi jendela , meskipun ini mungkin mahal untuk dieksekusi.
Semua kolom harus dicantumkan secara eksplisit di dalam klausa UNPIVOT. Mereka dapat diseret menggunakan SSMS, seperti yang disarankan @ db2. Itu tidak akan dinamis ketika definisi tabel chagnes, seperti saran Aaron Bertrand. Ini adalah kasus untuk hampir semua SQL.
Untuk set data saya yang agak terbatas, rencana eksekusi adalah scan indeks berkerumun dan agregat aliran. Memori ini akan lebih mahal daripada pemindaian langsung tabel dan banyak klausa ATAU.
sumber