Приблизно біт з постійною 1 або 0 в SQL Server


154

Чи можна виразити 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)

Відповіді:


226
cast (
  case
    when FC.CourseId is not null then 1 else 0
  end
as bit)

Специфікація CAST - це "CAST (тип виразу AS)". СЛУЧАЙ - це вираження в цьому контексті.

Якщо у вас є кілька таких виразів, я оголошу bit 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 ...

1
Ніт, має бути "else 0" на лінії 5.
Shannon Severance

1
Щоб зробити код більш читабельним, ми стандартизували свій SQL і тепер використовуємо оголошені бітові змінні, коли нам потрібно виразити true / false.
Демієн Макгіверн

@Damien McGivern: Я вважав це також корисним, коли в мене було багато CASTs
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()нульовий, але повертає перше ненулеве.

Non-Zero 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

Привіт, і ласкаво просимо до SO. Будь ласка, поясніть свою відповідь.
Чай

Незважаючи на те, що IIF виглядає краще case when ... else ... end, все одно доводиться виходити 1і 0для типу BIT.
Фабіо А.

-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.