Неявный бит с константой 1 или 0 в SQL Server

154

Можно ли выразить 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)

Дэмиен МакГиверн
источник

Ответы:

226
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 ...
ГБН
источник
1
Нит, должно быть «иначе 0» в строке 5.
Шеннон Северанс
1
Чтобы сделать код более читабельным, мы стандартизировали наш SQL и теперь используем объявленные битовые переменные, когда нам нужно выразить true / false.
Дэмиен МакГиверн
@Damien McGivern: я тоже нашел это полезным, когда у меня было много АКТЕРОВ
gbn
10

Вы можете добавить второй фрагмент в качестве определения поля для 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
Майкл Петротта
источник
Это работает, но имеет недостаток в том, что cast () возвращает тип NULL.
Дан
6

Нет, но вы могли бы привести все выражение, а не его подкомпоненты. На самом деле, это, вероятно, делает его менее читабельным в этом случае.

Гэри МакГилл
источник
4

Чуть более сжатый, чем у gbn:

Предполагая, что CourseIdэто ненулевое

CAST (COALESCE(FC.CourseId, 0) AS Bit)

COALESCEкак ISNULL(), но возвращает первый ненулевой.

Ненулевое значение CourseIdбудет приведено к типу 1, в то время как нулевое значение CourseIdзаставит COALESCE вернуть следующее значение, 0

kpkpkp
источник
4

Если вы хотите, чтобы столбец был BIT, а НЕ NULL, вы должны поставить ISNULL перед CAST.

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased
Фабио Насименто
источник
1

К сожалению нет. Вам придется разыгрывать каждое значение индивидуально.

Эндрю Хэйр
источник
0

Выражение для использования внутри SELECT может быть

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
источник
Сделайте этот ответ более полезным и объясните или предоставьте ссылки на библиотеку / документы
happymacarts
Здравствуйте и добро пожаловать в ТАК. Пожалуйста, объясните свой ответ.
Chait
Хотя ИИФ выглядит лучше, чем case when ... else ... endодин, все равно приходится кастовать 1и 0на БИТ типа.
Фабио А.
-1

Наслаждайтесь этим :) Без применения каждого значения в отдельности.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Адриан С.
источник