Предположим, что бит с константой 1 или 0 в SQL Server
Можно ли выразить 1 или 0 как бит при использовании в качестве значения поля в инструкции select?
например.
В этом случае оператор (который является частью оператора select). 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)
Ответы
Ответ 1
cast (
case
when FC.CourseId is not null then 1 else 0
end
as bit)
Спецификация CAST - "CAST (выражение AS type)". CASE является выражением в этом контексте.
Если у вас есть несколько таких выражений, я бы объявлял бит vars @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 ...
Ответ 2
Вы можете добавить второй фрагмент кода в качестве определения поля для объекта в приложении.
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
Ответ 3
Нет, но вы можете использовать целое выражение, а не субкомпоненты этого выражения. Фактически, это, вероятно, делает его менее читаемым в этом случае.
Ответ 4
Чуть более сжатый, чем gbn's:
Предполагая, что CourseId
отличен от нуля
CAST (COALESCE(FC.CourseId, 0) AS Bit)
COALESCE
похож на ISNULL()
, но возвращает первый не-нуль.
A Non-Zero CourseId
получит тип-cast в 1, а null CourseId
приведет к тому, что COALESCE вернет следующее значение, 0
Ответ 5
Если вы хотите, чтобы столбец BIT и NOT NULL, вы должны поставить ISNULL перед CAST.
ISNULL(
CAST (
CASE
WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
END
AS BIT)
,0) AS IsCoursedBased
Ответ 6
К сожалению, нет. Вы должны будете отнести каждое значение отдельно.
Ответ 7
IIF (FC.CourseId NOT NULL, 1, 0)
Ответ 8
Наслаждайтесь этим:)
Без каждого отдельного значения.
SELECT ...,
IsCoursedBased = CAST(
CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
AS BIT
)
FROM fc