Присвойте результат операторов логической логики битовому полю в T-sql - PullRequest
2 голосов
/ 04 мая 2011

в соответствии с этим вопросом , я не могу присвоить результат логического оператора логики в битовое поле. Моя проблема в том, что я работаю над сценарием создания, и у меня есть несколько зависимых флагов, для выполнения которых требуется логическое выражение. Этот сценарий запустится, когда все пустые значения, и пользователь просто вводит данные, которые он хочет. Сценарий обнаружит, если запись уже существует. Если это так, он обновит только те параметры, которые не являются нулевыми. Если он не существует, скрипт создаст новую запись. Я использую SQL Server 2005.

У меня есть инструкция вставки, использующая ISNULL(@Setting1, 0) для установки значения по умолчанию, когда переменная не назначена. Моя проблема связана с одним конкретным параметром, который зависит от 2 флагов настроек. Я также хотел бы увидеть решение, которое могло бы поддерживать другой установочный флаг, если бы мне нужно было его добавить.

DECLARE @Setting1 bit
DECLARE @Setting2 bit
DECLARE @Setting3 bit

--... code snipped for setting the value

UPDATE
    MyTable
SET
    EnableSetting1 = ISNULL(@Setting1, EnableSetting1),
    EnableSetting1 = ISNULL(@Setting2, EnableSetting2),
    EnableSetting1 = ISNULL(@Setting3, EnableSetting3),
    EnableComplexSetting1 = ISNULL(@Setting1, EnableComplexSetting1),
    EnableComplexSetting2 = ?
WHERE
    Id = @MyId

Логически, ? будет выглядеть как ISNULL(@Setting2, EnableSetting2) OR ISNULL(@Setting3, EnableSetting3), но это, очевидно, неверно. Как мне установить сложную настройку 2? Как бы я это сделал, если бы логически это было ISNULL(@Setting2, EnableSetting2) OR ISNULL(@Setting3, EnableSetting3) OR ISNULL(@Setting4, EnableSetting4) и т. Д.

1 Ответ

3 голосов
/ 04 мая 2011

ISNULL не возвращает логическое значение - он просто использует второе значение при условии, что первое выражение равно NULL.

Вам нужно будет использовать что-то вроде этого:

UPDATE
    MyTable
SET
    EnableSetting1 = CASE WHEN @Setting1 IS NULL THEN 1 ELSE 0 END,
...

В зависимости от того, какое логическое значение вы хотите сохранить, если @Setting1 действительно равно NULL, вам может потребоваться переключить два значения в случаях THEN и ELSE ....

С этимподход, вы должны быть в состоянии также проверить два условия:

UPDATE MyTable
SET EnableComplexSetting2 = 
        CASE WHEN (Complex1 IS NULL AND Complex2 IS NULL) THEN 1 ELSE 0 END 

 ......
...