web-dev-qa-db-fra.com

Un bit avec constante 1 ou dans SQL Server

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, 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 de type, je dois lancer 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 en tant que type de bit sans avoir à lancer à chaque fois?

(J'utilise MS SQL Server 2005)

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

La spécification CAST est "CAST (type d'expression AS)". 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 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 ...
189
gbn

Vous pouvez ajouter le deuxième extrait 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
10
Michael Petrotta

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

5
Gary McGill

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

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased
3
fnascimento

Légèrement plus condensé que gbn:

En supposant que CourseId est différent de zéro

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

COALESCE est comme une ISNULL(), mais renvoie le premier non-Null.

Une variable CourseId différente de zéro sera transtypée en 1, tandis qu'une valeur null CourseId fera en sorte que COALESCE renvoie la valeur suivante, 0

3
kpkpkp

Malheureusement non. Vous devrez attribuer chaque valeur individuellement.

1
Andrew Hare

Profitez de ceci:) Sans convertir chaque valeur individuellement.

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

L’expression à utiliser dans SELECT peut être

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