Проверьте, не является ли какой-либо столбец NOT NULL - программирование
Подтвердить что ты не робот

Проверьте, не является ли какой-либо столбец NOT NULL

Мне нужно проверить, не является ли столбец NOT NULL в моей инструкции 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

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

4b9b3361

Ответ 1

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

Пример:

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

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

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

Ответ 2

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

Pros

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

против

  • Ваши данные будут деформированы.
  • Более сложное/техническое обслуживание
  • Больше места для дополнительного столбца

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

Ответ 3

Мне обычно нравится предложение @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, но, возможно, стоит попробовать.

Ответ 4

Ответ принят 5 лет назад, но, как сказал Брэд, под вопросом название coalesce - неправильный подход. Если в некоторых случаях вам действительно нужно проверить или ANY параметр имеет значение null, вы можете использовать это:

where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null