Проверьте, не является ли какой-либо столбец НЕ ПУСТО - PullRequest
17 голосов
/ 03 января 2012

Мне нужно проверить, не является ли столбец НЕ ПУСТО в моем выражении SQL.

Мой SQL-запрос:

select column_a, column_b, column_c, column_d, column_x
from myTable

В моем выборе много столбцов.Так что у меня проблема с производительностью, если я сделаю следующее:

select column_a, column_b, column_c, column_d, column_x
from myTable
where column_a is not null or column_b is not null or column_c is not null 
or column_x  is not null

Есть ли другой (лучший) способ проверить, есть ли какие-либо столбцы, которые НЕ являются NULL?

Ответы [ 4 ]

25 голосов
/ 03 января 2012

Вы можете использовать COALESCE для этого.COALESCE возвращает первое ненулевое значение, если оно есть.Это, вероятно, не будет работать лучше, но гораздо более читабельно.

Пример:

where coalesce(column_a, column_b, column_c, column_x) is not null 

В зависимости от мощности ваших данных, вы можетедобавьте индексы для повышения производительности.

Другая возможность - использовать постоянный вычисляемый столбец, который сообщает вам, являются ли все четыре столбца пустыми или нет.

3 голосов
/ 03 января 2012

Одним из способов решения этой проблемы может быть добавление дополнительного битового столбца, который отслеживает, есть ли какие-либо значения или нет.

Плюсы

  • Может быть реализовано с помощью триггеров, поэтому вам не нужно менять остальную часть кода
  • Не требуетсканирование других столбцов
  • Этот столбец может быть проиндексирован

Минусы

  • Ваши данные будут нормализованы
  • Более сложное / более сложное обслуживание
  • Больше места для хранения дополнительной колонки

Перевешивают ли плюсы минусы, зависит от того, какой удар по производительности вы получаете, просматриваяв других столбцах.Заполните профиль перед совершением!

2 голосов
/ 03 января 2012

Мне обычно нравится предложение @ RedFilter о COALESCE, но другим решением может быть использование функции CHECKSUM (). Конечно, значение контрольной суммы для всех значений NULL зависит от столбцов и типов данных, поэтому вам сначала нужно выполнить запрос, чтобы получить это значение. Что-то вроде:

select CHECKSUM(*) AS [All_NULL_Value]
from myTable
where column_a is null
AND column_b is null
AND column_c is null
AND column_d is null
AND column_x  is null

Тогда вы можете сделать это:

select column_a, column_b, column_c, column_d, column_x
from myTable
where CHECKSUM(*) <> {All_NULL_Value_obtained_above}

Я не уверен, что это работает лучше или хуже, чем идея COALESCE, но, возможно, стоит попробовать.

0 голосов
/ 11 августа 2017

Ответ принят 5 лет назад, но, как сказал Брэд, по названию вопроса слияние является неправильным подходом.Если в некоторых случаях вам действительно нужно проверить или ЛЮБОЙ параметр имеет значение NULL, вы можете использовать это:

where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...