Implica bit com constante 1 ou 0 no SQL Server

154

É possível expressar 1 ou 0 como um bit quando usado como um valor de campo em uma instrução select?

por exemplo

Nesse caso, a instrução (que faz parte de uma instrução select) ICourseBased é do tipo int.

case 
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased

Para que seja um tipo de bit, tenho que converter os dois valores.

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

Existe uma maneira curta de expressar os valores como tipo de bit sem precisar converter todas as vezes?

(Estou usando o MS SQL Server 2005)

Damien McGivern
fonte

Respostas:

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

A especificação CAST é "CAST (expressão AS type)". O CASE é uma expressão neste contexto.

Se você tiver várias expressões, eu declararia bit vars @true e @false e as usaria. Ou use UDFs se você realmente quiser ...

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 ...
gbn
fonte
1
Um nit, deve ser "else 0" na linha 5. #
Shannon Severance
1
Para tornar o código mais legível, padronizamos nosso SQL e agora usamos variáveis ​​de bits declaradas quando precisamos expressar verdadeiro / falso.
Damien McGivern 22/02
@ Damien McGivern: Eu também achei útil quando eu tinha muitos CASTs
gbn
10

Você pode adicionar o segundo trecho como uma definição de campo para ICourseBased em uma exibição.

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
Michael Petrotta
fonte
Isso funciona, mas tem a desvantagem que cast () retorna um tipo NULL.
Dan
6

Não, mas você pode converter a expressão inteira em vez dos subcomponentes dessa expressão. Na verdade, isso provavelmente torna menos legível neste caso.

Gary McGill
fonte
4

Um pouco mais condensado que o de gbn:

Supondo que CourseIdseja diferente de zero

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

COALESCEé como um ISNULL(), mas retorna o primeiro não nulo.

Um Diferente de Zero CourseIdreceberá conversão de tipo para 1, enquanto um nulo CourseIdfará com que COALESCE retorne o próximo valor, 0

kpkpkp
fonte
4

Se você deseja que a coluna seja BIT e NOT NULL, coloque ISNULL antes do CAST.

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

Infelizmente não. Você terá que converter cada valor individualmente.

Andrew Hare
fonte
0

A expressão a ser usada dentro do SELECT pode ser

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
fonte
Tornar esta resposta mais útil e explicar ou fornecer links para biblioteca / docs
happymacarts
Olá, e bem-vindo ao SO. Por favor, explique sua resposta.
Chait
Embora IIF pareça melhor do que case when ... else ... end, ainda é preciso transmitir 1e 0para o tipo BIT.
Fabio
-1

Aproveite isso :) Sem converter cada valor individualmente.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Adrian S.
fonte