web-dev-qa-db-ja.com

SQL Serverの定数1または0の暗黙ビット

Selectステートメントでフィールド値として使用する場合、1または0をビットとして表現することは可能ですか?

例えば.

この場合、ステートメント(selectステートメントの一部)ICourseBasedはint型です。

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

ビット型にするには、両方の値をキャストする必要があります。

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

毎回キャストすることなく、値をビット型として表現する簡単な方法はありますか?

(私はMS SQL Server 2005を使用しています)

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

CAST仕様は「CAST(式ASタイプ)」です。 CASEは、このコンテキストではexpressionです。

そのような式が複数ある場合は、ビット変数@trueおよび@falseを宣言して使用します。または、本当に必要な場合はUDFを使用してください...

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

ビューのICourseBasedのフィールド定義として2番目のスニペットを追加できます。

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

いいえ。ただし、式のサブコンポーネントではなく、式全体をキャストできます。実際、この場合、おそらくless読み取り可能になります。

5
Gary McGill

列がBITおよびNOT NULLである場合は、CASTの前にISNULLを配置する必要があります。

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

Gbnよりも少し凝縮されています。

CourseIdがゼロ以外の場合

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

COALESCEISNULL()に似ていますが、最初の非NULLを返します。

ゼロ以外のCourseIdは1に型キャストされ、null CourseIdはCOALESCEが次の値0を返すようにします

4
kpkpkp

残念だけど違う。各値を個別にキャストする必要があります。

1
Andrew Hare

これをお楽しみください:)各値を個別にキャストせずに。

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

SELECT内で使用する式は

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