Implicano bit con costante 1 o 0 in SQL Server
-
19-09-2019 - |
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)
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