Mengimplikasikan bit dengan konstanta 1 atau 0 di SQL Server

154

Apakah mungkin untuk menyatakan 1 atau 0 sedikit ketika digunakan sebagai nilai bidang dalam pernyataan pilih?

misalnya

Dalam hal ini pernyataan (yang merupakan bagian dari pernyataan pilih) ICourseBased adalah tipe int.

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

Untuk membuatnya menjadi tipe bit saya harus memberikan kedua nilai.

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

Apakah ada cara singkat untuk mengekspresikan nilai sebagai tipe bit tanpa harus melakukan cast setiap waktu?

(Saya menggunakan MS SQL Server 2005)

Damien McGivern
sumber

Jawaban:

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

Spesifikasi CAST adalah "CAST (tipe ekspresi AS)". KASUS adalah ekspresi dalam konteks ini.

Jika Anda memiliki beberapa ekspresi seperti itu, saya akan mendeklarasikan bit vars @true dan @false dan menggunakannya. Atau gunakan UDF jika Anda benar-benar ingin ...

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 ...
gbn
sumber
1
A nit, harus "selain 0" pada jalur 5.
Shannon Severance
1
Untuk membuat kode lebih mudah dibaca, kita menstandarisasi SQL kita dan sekarang menggunakan variabel bit yang dideklarasikan ketika kita perlu mengekspresikan true / false.
Damien McGivern
@Damien McGivern: Saya merasa berguna juga ketika saya memiliki banyak CAST
gbn
10

Anda dapat menambahkan potongan kedua sebagai definisi bidang untuk ICourseBased dalam tampilan.

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
Michael Petrotta
sumber
Ini berfungsi, tetapi memiliki sisi negatif yang memberikan () mengembalikan tipe NULL.
Dan
6

Tidak, tetapi Anda bisa menggunakan seluruh ekspresi daripada sub-komponen dari ekspresi itu. Sebenarnya, itu mungkin membuatnya kurang mudah dibaca dalam kasus ini.

Gary McGill
sumber
4

Sedikit lebih padat daripada gbn:

Dengan asumsi CourseIdtidak nol

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

COALESCEseperti ISNULL(), tetapi mengembalikan non-Null pertama.

Non-Zero CourseIdakan mendapatkan tipe-cast ke 1, sedangkan nol CourseIdakan menyebabkan COALESCE mengembalikan nilai berikutnya, 0

kpkpkp
sumber
4

Jika Anda ingin kolom BIT dan BUKAN NULL, Anda harus meletakkan ISNULL sebelum CAST.

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

Sayangnya tidak ada. Anda harus memberikan setiap nilai secara individual.

Andrew Hare
sumber
0

Ekspresi yang digunakan dalam SELECT bisa berupa

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
IamProfChaos
sumber
Jadikan jawaban ini lebih bermanfaat dan jelaskan atau berikan tautan ke perpustakaan / dokumen
happymacarts
Halo, dan selamat datang di SO. Tolong jelaskan jawaban Anda.
Chait
Meskipun IIF terlihat lebih baik daripada case when ... else ... end, kita masih harus menggunakan 1dan 0untuk tipe BIT.
Fabio A.
-1

Nikmati ini :) Tanpa memberikan setiap nilai secara individual.

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