Предположим, что бит с константой 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