168

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

例えば

この case ステートメント (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 を使用しています)

4

8 に答える 8

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

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

そのような式が複数ある場合は、ビット変数@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 ...
于 2009-07-23T16:04:24.203 に答える
11

ビュー内の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
于 2009-07-23T16:07:24.617 に答える
6

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

于 2009-07-23T16:04:14.983 に答える
5

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

CourseIdが非ゼロであると仮定

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

COALESCEに似てISNULL()いますが、最初の非 Null を返します。

Non-ZeroCourseIdは 1 に型キャストされますが、nullCourseIdは COALESCE が次の値 0 を返す原因になります。

于 2014-01-23T17:49:35.010 に答える
4

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

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased
于 2015-09-14T11:35:55.023 に答える
1

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

于 2009-07-23T16:04:21.863 に答える
-2

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

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
于 2017-12-13T14:10:18.290 に答える