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)

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

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

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.


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


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

1

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


0

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.