Domanda

E 'possibile esprimere 1 o 0 come un po' quando viene utilizzato come un valore di campo in una dichiarazione prescelta?

per es.

In questo caso affermazione (che fa parte di una dichiarazione prescelta) ICourseBased è di tipo int.

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

Per arrivare ad essere un po 'di tipo devo lanciare entrambi i valori.

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

C'è un modo breve mano di esprimere i valori come tipo bit senza dover lanciare ogni volta?

(sto usando MS SQL Server 2005)

È stato utile?

Soluzione

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

La specifica CAST è "CAST (espressione AS tipo)". Il caso è un espressione , in questo contesto.

Se si dispone di più tali espressioni, mi piacerebbe dichiarare po 'vars @True e @false e utilizzarli. Oppure utilizzare UDF se si voleva davvero ...

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

Altri suggerimenti

Si potrebbe aggiungere il secondo frammento di come una definizione di campo per ICourseBased in una vista.

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

No, ma si potrebbe lanciare l'intera espressione, piuttosto che i sub-componenti di tale espressione. A dire il vero, che probabilmente rende meno leggibile in questo caso.

Un po 'più condensato di gbn di:

Supponendo CourseId è diverso da zero

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

COALESCE è come un ISNULL(), ma restituisce il primo non nullo.

A CourseId non-zero otterrà type-cast un 1, mentre un CourseId nullo causerà COALESCE per restituire il valore successivo, 0

Se si vuole che la colonna è po 'e NOT NULL, si dovrebbe mettere ISNULL prima del CAST.

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

Purtroppo, no. Si dovrà lanciare ogni valore singolarmente.

L'espressione da utilizzare all'interno SELEZIONA potrebbe essere

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

Godetevi questo :) Senza getto di ogni valore singolarmente.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top