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)

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

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

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.


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


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

1

Malheureusement non. Vous devrez lancer chaque valeur individuellement.


0

L'expression à utiliser dans SELECT pourrait être

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.