Проверьте, не является ли какой-либо столбец 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?
Ответы
Ответ 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