Wiele rozwiązań dla: niektórych zer, wszystkich zer, pojedynczych i wielu kolumn oraz szybkie SZYBKIE użycie Top 1
Jeśli chcesz przetestować wiele kolumn, możesz użyć następujących opcji:
Column_1 Column_2 Column_3
-------- -------- --------
1 2 NULL
1 NULL NULL
5 6 NULL
Najpierw sprawdź NULL i policz je:
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
Daje liczbę NULL:
Column_1 Column_2 Column_3
0 1 3
Jeśli wynik wynosi 0, nie ma wartości NULL.
Po drugie , policzmy wartości inne niż 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
... Ale ponieważ liczymy tutaj wartości inne niż NULL, można to uprościć:
select
count(Column_1) as Column_1,
count(Column_2) as Column_2,
count(Column_3) as Column_3,
from TestTable
Każdy z nich daje:
Column_1 Column_2 Column_3
3 2 0
Tam, gdzie wynik wynosi 0, kolumna składa się całkowicie z wartości NULL.
Wreszcie , jeśli musisz tylko sprawdzić konkretną kolumnę, TOP 1 jest szybszy, ponieważ powinien zatrzymać się przy pierwszym trafieniu. Następnie możesz opcjonalnie użyć funkcji count (*), aby uzyskać wynik typu 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 = Nie ma wartości NULL, 1 = Istnieje co najmniej jedna wartość NULL
lub
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 = Wszystkie mają wartość NULL, 1 = Istnieje co najmniej jedna wartość inna niż NULL
Mam nadzieję, że to pomoże.
UNPIVOT tłumaczy kolumny na wiersze. W procesie eliminuje wartości NULL ( odniesienie ).
Biorąc pod uwagę wkład
zapytanie UNPIVOT
wytworzy wynik
Niestety rząd 4 został całkowicie wyeliminowany, ponieważ ma tylko NULL! Można go wygodnie ponownie wprowadzić, wprowadzając wartość fikcyjną do zapytania źródłowego:
Agregując wiersze według identyfikatora, możemy policzyć wartości inne niż null. Porównanie całkowitej liczby kolumn w tabeli źródłowej pozwoli zidentyfikować wiersze zawierające co najmniej jedną wartość NULL.
Obliczam 3 jako liczbę kolumn w tabeli źródłowej #t
+ 1 dla wstrzykiwanej kolumny obojętnej
- 1 dla identyfikatora, który nie jest UNPIVOTED
Wartość tę można uzyskać w czasie wykonywania, sprawdzając tabele katalogu.
Oryginalne wiersze można odzyskać, łącząc się z wynikami.
Jeżeli mają być badane wartości inne niż NULL, można je włączyć do klauzuli where:
Dyskusja
Wymaga to identyfikatora przenoszonego przez UNPIVOT. Klucz byłby najlepszy. Jeśli nie istnieje, można wprowadzić ROW_NUMBER () funkcji okna , choć jego wykonanie może być kosztowne.
Wszystkie kolumny muszą być wyraźnie wymienione w klauzuli UNPIVOT. Można je przeciągać za pomocą SSMS, jak sugeruje @ db2. Nie będzie dynamiczny, gdy zmieni się definicja tabeli, jak sugerowałaby Aaron Bertrand. Jest tak jednak w przypadku prawie wszystkich SQL.
W przypadku mojego raczej ograniczonego zestawu danych plan wykonania to skanowanie indeksu klastrowego i agregacja strumienia. Będzie to droższe w pamięci niż zwykły skan tabeli i wiele klauzul OR.
źródło