Несколько решений для: некоторые нули, все нули, один и несколько столбцов, а также сделать его быстро, используя топ 1
Если вам нужно протестировать несколько столбцов, вы можете использовать следующее:
Column_1 Column_2 Column_3
-------- -------- --------
1 2 NULL
1 NULL NULL
5 6 NULL
Сначала проверьте NULL и посчитайте их:
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
Возвращает количество пустых значений:
Column_1 Column_2 Column_3
0 1 3
Если результат равен 0, значения 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
... Но поскольку здесь мы считаем ненулевые значения, это можно упростить до:
select
count(Column_1) as Column_1,
count(Column_2) as Column_2,
count(Column_3) as Column_3,
from TestTable
Либо один дает:
Column_1 Column_2 Column_3
3 2 0
Если результат равен 0, столбец полностью состоит из NULL.
Наконец , если вам нужно только проверить определенный столбец, то TOP 1 быстрее, потому что он должен остановиться при первом попадании. Затем вы можете при желании использовать count (*) для получения результата в логическом стиле:
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 = нет NULL, 1 = есть хотя бы один NULL
или
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 = все они равны NULL, 1 = есть хотя бы один ненулевой
Надеюсь, это поможет.
UNPIVOT переводит столбцы в строки. В процессе исключаются значения NULL ( ссылка ).
Учитывая вход
запрос UNPIVOT
будет производить вывод
К сожалению, строка 4 полностью исключена, поскольку в ней только NULL! Это может быть удобно повторно введено путем введения фиктивного значения в исходный запрос:
Агрегируя строки по ID, мы можем посчитать ненулевые значения. Сравнение с общим числом столбцов в исходной таблице идентифицирует строки, содержащие один или несколько NULL.
Я вычисляю 3 как
количество столбцов в исходной таблице #t
+ 1 для вставленного фиктивного столбца
- 1 для идентификатора, который не является НЕУЧАСТНЫМ
Это значение может быть получено во время выполнения путем изучения таблиц каталога.
Исходные строки можно получить, присоединившись к результатам.
Если значения, отличные от NULL, должны быть исследованы, они могут быть включены в предложение where:
обсуждение
Для этого требуется идентификатор, который передается через UNPIVOT. Ключ будет лучшим. Если ничего не существует, его можно ввести с помощью ROW_NUMBER () оконной функции , хотя это может быть дорогостоящим для выполнения.
Все столбцы должны быть явно перечислены в предложении UNPIVOT. Их можно перетащить с помощью SSMS, как предложено @ db2. Это не будет динамичным, когда определение таблицы искажается, как было бы предложено Аароном Бертраном. Однако это касается почти всех SQL.
Для моего довольно ограниченного набора данных план выполнения - это сканирование кластерного индекса и агрегат потока. Это будет дороже памяти, чем прямое сканирование таблицы и множество предложений OR.
источник