Я пытаюсь создать представление, где я хочу, чтобы столбец был только TRUE или FALSE. Однако кажется, что независимо от того, что я делаю, SQL Server (2008) полагает, что мой разрядный столбец может так или иначе быть пустым.
У меня есть таблица, названная "продуктом" со столбцом "Status", который является INT, NULL
. В представлении я хочу возвратить строку для каждой строки в продукте с НЕБОЛЬШИМ набором столбца к истинному если продукт. Столбец состояния равен 3, иначе битовое поле должно быть ложью.
SQL в качестве примера
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Если я сохраняю этот запрос как представление и смотрю на столбцы в Обозревателе объектов, столбец HasStatus установлен на BIT, NULL
. Но это никогда не должно быть ПУСТЫМ. Есть ли некоторый волшебный прием SQL, который я могу использовать, чтобы вынудить этот столбец быть NOT NULL
.
Заметьте это, если я удаляю CAST()
вокруг CASE
, столбец правильно установлен как NOT NULL
, но тогда тип столбца установлен на INT
, который не является тем, что я хочу. Я хочу, чтобы это было BIT
. :-)
Вы можете добиться желаемого, немного изменив порядок запроса.Уловка заключается в том, что ISNULL
должен быть снаружи, прежде чем SQL Server поймет, что результирующее значение никогда не может быть NULL
.
SELECT ISNULL(CAST(
CASE Status
WHEN 3 THEN 1
ELSE 0
END AS bit), 0) AS HasStatus
FROM dbo.Product
Одна из причин, по которой я считаю это полезным, - это использование ORM и нежелание отображать результирующее значение в тип, допускающий значение NULL. Это может упростить задачу, если ваше приложение увидит, что значение никогда не может быть нулевым. Тогда вам не нужно писать код для обработки нулевых исключений и т. Д.
Все, что вы можете делать с помощью оператора Select, - это управлять данными, которые ядро базы данных отправляет вам как клиенту. Оператор select не влияет на структуру базовой таблицы. Чтобы изменить структуру таблицы, вам необходимо выполнить оператор Alter Table.
Alter Table dbo.Product Изменить бит состояния столбца не равен нулю
Если, otoh, все, что вы пытаетесь сделать, это контролировать вывод представления, то того, что вы делаете, достаточно. Ваш синтаксис гарантирует, что вывод столбца HasStatus в наборе результатов представлений на самом деле никогда никогда не будет нулевым. Это будет всегда либо битовое значение = 1, либо битовое значение = 0. Не беспокойтесь о том, что говорит обозреватель объектов ...