Неявный бит с константой 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


4

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

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased


0

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

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)

Сделайте этот ответ более полезным и объясните или предоставьте ссылки на библиотеку / документы
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.