Неявный бит с константой 1 или 0 в SQL Server
Можно ли выразить 1 или 0 как бит при использовании в качестве значения поля в операторе выбора?
например
В этом случае оператор (который является частью оператора выбора) ICourseBased имеет тип int.
case
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased
Чтобы получить битовый тип, я должен привести оба значения.
case
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased
Есть ли краткий способ выражения значений в виде битов без необходимости приведения каждый раз?
(Я использую MS SQL Server 2005)
8 ответов
cast (
case
when FC.CourseId is not null then 1 else 0
end
as bit)
CAST-спецификацией является "CAST (выражение типа AS)". CASE является выражением в этом контексте.
Если у вас есть несколько таких выражений, я бы объявил битовые переменные @true и @false и использовал их. Или используйте UDF, если вы действительно хотели...
DECLARE @True bit, @False bit;
SELECT @True = 1, @False = 0; --can be combined with declare in SQL 2008
SELECT
case when FC.CourseId is not null then @True ELSE @False END AS ...
Вы можете добавить второй фрагмент в качестве определения поля для ICourseBased в представлении.
DECLARE VIEW MyView
AS
SELECT
case
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased
...
SELECT ICourseBased FROM MyView
Чуть более сжатый, чем у gbn:
Если предположить, CourseId
ненулевой
CAST (COALESCE(FC.CourseId, 0) AS Bit)
COALESCE
это как ISNULL()
, но возвращает первое ненулевое значение.
Нулевой CourseId
получит приведение типа к 1, а ноль CourseId
заставит COALESCE вернуть следующее значение, 0
Нет, но вы могли бы привести все выражение, а не его подкомпоненты. На самом деле, это, вероятно, делает его менее читабельным в этом случае.
Если вы хотите, чтобы столбец был BIT, а НЕ NULL, вы должны поставить ISNULL перед CAST.
ISNULL(
CAST (
CASE
WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
END
AS BIT)
,0) AS IsCoursedBased
Выражение для использования внутри SELECT может быть
CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
К сожалению нет. Вам придется разыгрывать каждое значение индивидуально.
Наслаждайтесь этим:) Без применения каждого значения в отдельности.
SELECT ...,
IsCoursedBased = CAST(
CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
AS BIT
)
FROM fc