Imply bit avec la constante 1 ou 0 dans SQL Server

154

Est-il possible d'exprimer 1 ou 0 sous forme de bit lorsqu'il est utilisé comme valeur de champ dans une instruction SELECT?

par exemple

Dans ce cas, l'instruction (qui fait partie d'une instruction select) ICourseBased est de type int.

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

Pour que ce soit un peu type, je dois convertir les deux valeurs.

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

Existe-t-il un moyen rapide d'exprimer les valeurs sous forme de type de bit sans avoir à effectuer un cast à chaque fois?

(J'utilise MS SQL Server 2005)

Damien McGivern
la source

Réponses:

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

La spécification CAST est "CAST (expression AS type)". Le CASE est une expression dans ce contexte.

Si vous avez plusieurs expressions de ce type, je déclarerais bit vars @true et @false et les utiliserais. Ou utilisez des UDF si vous le vouliez vraiment ...

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
la source
1
A nit, devrait être "else 0" sur la ligne 5.
Shannon Severance
1
Pour rendre le code plus lisible, nous avons standardisé notre SQL et utilisons maintenant des variables de bits déclarées lorsque nous devons exprimer vrai / faux.
Damien McGivern
@Damien McGivern: Je l' ai trouvé utile aussi quand j'avais beaucoup CAST
GBN
10

Vous pouvez ajouter le deuxième extrait de code en tant que définition de champ pour ICourseBased dans une vue.

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
la source
Cela fonctionne, mais présente l'inconvénient que cast () renvoie un type NULL.
Dan
6

Non, mais vous pouvez convertir l'expression entière plutôt que les sous-composants de cette expression. En fait, cela le rend probablement moins lisible dans ce cas.

Gary McGill
la source
4

Un peu plus condensé que celui des gbn:

En supposant qu'il CourseIdest différent de zéro

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

COALESCEest comme an ISNULL(), mais renvoie le premier non-Null.

Un non-zéro CourseIdobtiendra une CourseIdconversion de type en 1, tandis qu'un null entraînera COALESCE pour renvoyer la valeur suivante, 0

kpkpkp
la source
4

Si vous voulez que la colonne soit BIT et NOT NULL, vous devez placer ISNULL avant CAST.

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

Malheureusement non. Vous devrez lancer chaque valeur individuellement.

Andrew Hare
la source
0

L'expression à utiliser dans SELECT pourrait être

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
la source
Rendre cette réponse plus utile et expliquer ou fournir des liens vers la bibliothèque / la documentation
happymacarts
Bonjour et bienvenue à SO. Veuillez expliquer votre réponse.
Chait
Bien que IIF soit meilleur que case when ... else ... end, il faut encore lancer 1et 0passer au type BIT.
Fabio A.
-1

Profitez-en :) Sans lancer chaque valeur individuellement.

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