Неявный бит с константой 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
Другие вопросы по тегам