SQL Serverで定数1または0のビットを暗示する


154

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を使用しています)

回答:


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

1
NITは、5行目の「0それ以外」でなければなりません
シャノン退職

1
コードを読みやすくするために、SQLを標準化し、true / falseを表現する必要があるときに宣言されたビット変数を使用します。
Damien McGivern、2011

@Damien McGivern:多くのCASTがあったときにも便利だと感じました
gbn

10

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

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

これは機能しますが、cast()がNULL型を返すという欠点があります。
Dan

6

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


4

GBNよりも少し凝縮されています:

CourseIdゼロでないと仮定

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

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

Non-Zero CourseIdは1に型キャストされ、null CourseIdはCOALESCEが次の値0を返すようにします。


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


0

SELECT内で使用する式は次のようになります。

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

この回答をより有用にし、ライブラリ/ドキュメントへのリンクを説明または提供してください
happymacarts 2017年

こんにちは、SOへようこそ。答えを説明してください。
Chait

が、IIFが良く見えるよりもcase when ... else ... end、人はまだキャストにあり10BIT型に。
Fabio A.

-1

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

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.